質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Q&A

解決済

3回答

962閲覧

文字列の出現回数 プログラム作成後の操作が分かりません

Arjuna

総合スコア2

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

0グッド

0クリップ

投稿2021/12/31 09:31

編集2021/12/31 09:34

前提・実現したいこと

manコマンドを用いて,vimのマニュアルをテキスト化して,ファイルを作成し,その中で,指定された文字列が何個あるか,出力するプログラムを作成したいです。そして、manコマンドの出力をテキストに変換するには,col-bコマンドを利用したいです。

発生している問題・エラーメッセージ

プログラムは、作成したのですが、プログラムを作成後にどのよう握っ校したらいいのか分かりません。

エラーメッセージ

該当のソースコード

C言語

1 2#include<stdio.h> 3#include<string.h> 4 5 int main(int argc , const char *argv[]){// …① 6 int count=0 , i ; 7 char buffer[1024],*adr ;// …② 8 FILE *fp; 9 10 if(argc!=3){//(a) 11 fprintf(stderr, "a.out input_file word"); //(b) 12 return(-1) ;//(c) 13 } 14 15 if ((fp = fopen(argv[1],"r"))==NULL){ /*(a)*/ 16/* ファイルが確認できなければエラーメッセージ出力 */ 17 printf("%s is not found.", argv[1]) ; 18 return (-1); 19 } 20 21 while (fgets(buffer,1024,fp) !=NULL) 22 { 23 adr=buffer; 24 while ((buffer[i] = fgetc(fp)) !=EOF){ 25 i++ ; 26 count++; 27 adr++; 28 } 29 } 30 fclose(fp); 31 printf("%s is %d\n", argv[2] , count);// …④ 32 33 return 0; 34 } 35

試したこと

Linuxのコマンドプロンプトの中で、$ LANG=c man vim | col -b > vim.txtを実行しましたが、ファイルが見つからないとのエラーが出ました。

補足情報(FW/ツールのバージョンなど)

Linuxまたは、ripple Itを使っています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2021/12/31 10:23

具体的なエラーメッセージを書きましょう。雰囲気だけでは駄目です。
episteme

2021/12/31 10:49

あなたが作ったプログラムの使い方がわからんとはどーゆーことですか?
Zuishin

2021/12/31 11:03

すごいなこれ。やりたいことにまるで関係ないソースコードをどこかから拾ってきて載せたのか。プログラミングなんかやめて外を走ってたらいいんじゃないかな。
jimbe

2021/12/31 11:47

> どのよう握っ校したら ???
jimbe

2021/12/31 11:52

このコードが「指定された文字列が何個あるか」を調べるプログラムなのでしょう。(なってないですけど。)
episteme

2021/12/31 12:22 編集

"どのようにぎっこうしたら"を変換しちゃったんだね♪ とりあえず書いたコードを食わせてみればちゃんと動くか確認できると思うょ
melian

2021/12/31 12:51 編集

> LANG=c man vim | col -b > vim.txtを実行しましたが、ファイルが見つからないとのエラーが出ました。 こちらで実行すると、 man: can't set the locale; make sure $LC_* and $LANG are correct と表示されます。
otn

2022/01/01 08:42

↑なるほど。cが小文字だったのには気づきませんでしたが警告だけで、英文manは出ますね。
guest

回答3

0

ベストアンサー

Linuxのコマンドプロンプトの中で、$ LANG=c man vim | col -b > vim.txt を実行しましたが、ファイルが見つからないとのエラーが出ました。

man の素性がよく判らないので Ubuntu Linux 21.04 の場合で話します。

man のソースコードを眺めてみると、以下の様なコードが目に付きます。

src/man.c · master · Debian / man-db · GitLab

c

1if (!troff && *COL) { 2 /* get rid of special characters if not writing to a 3 * terminal 4 */ 5 const char *man_keep_formatting = 6 getenv ("MAN_KEEP_FORMATTING"); 7 if ((!man_keep_formatting || !*man_keep_formatting) && 8 !isatty (STDOUT_FILENO)) 9 add_col (p, locale_charset, "-b", "-p", "-x", 10 (void *) 0); 11 }

コメント文に書かれてある通り、isatty (STDOUT_FILENO)stdout(標準出力)を調べていて、端末でなければ col コマンドに -b -p -x オプションを付加して実行(制御文字を除去)してからテキストを出力する様になっています。

したがって、少なくとも Debian 系 Linux ではファイルにリダイレクトしたり、パイプで繋げる場合は col -b を実行する必要は無さそうです。実際、以下では vim.txt はプレーンテキストになっています。

bash

1$ LC_MESSAGES=C man vim > vim.txt 2$ file vim.txt 3vim.txt: UTF-8 Unicode text

先のソースコードにある様に、環境変数 MAN_KEEP_FORMATTING を設定しておくと制御文字付きで出力されます。

bash

1$ MAN_KEEP_FORMATTING=1 LC_MESSAGES=C man vim > vim_formatted.txt 2$ file vim_formatted.txt 3vim_formatted.txt: UTF-8 Unicode text, with overstriking

そして、manコマンドの出力をテキストに変換するには,col-bコマンドを利用したいです。

なので、どうしても col -b コマンドを利用したいのであれば MAN_KEEP_FORMATTING=1(数値は適当で構いません)などとして man を実行することになります(Debian 系 Linux の場合)。

vimのマニュアルをテキスト化して,ファイルを作成し,その中で,指定された文字列が何個あるか,出力するプログラムを作成したいです。

vim(1) の内容は頻繁に変更されるわけではないので、予め histogram(出現頻度表)を作っておくと良いかもしれません。

bash

1$ tr --version 2tr (GNU coreutils) 8.32 3$ grep --version 4grep (GNU grep) 3.6 5$ sort --version 6sort (GNU coreutils) 8.32 7$ uniq --version 8uniq (GNU coreutils) 8.32 9$ sed --version 10sed (GNU sed) 4.7 11 12$ LC_MESSAGES=C man vim | 13 tr '[[:upper:]]' '[[:lower:]]' | 14 grep -Po '\w+' | 15 sort | uniq -c | 16 sed -E 's/\s*(\w+) (\w+)/\2\t\1/' > words_histogram_in_man_vim.txt 17 18$ cat words_histogram_in_man_vim.txt 190 1 201 5 2110 3 22 : 23a 62 24aborts 4 25about 3 26above 3 27accidentally 1 28 : 29vi 11 30vi_diff 3 31view 3 32viewed 1 33vim 86 34vim82 10 35 : 36

投稿2021/12/31 14:09

編集2021/12/31 14:57
melian

総合スコア19703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

そのコードに食わすネタとして vim.txt を作りたいのかな? だったら:

export LANG=C man vim | col -b > vim.txt

ですかね。

投稿2021/12/31 12:14

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

とりあえず、vim.txtにvimのmanualを落とすコマンドは以下になります。
man -P cat vim | col -b >vim.txt
manはページャーにlessを使うのでそのままでは標準出力にだせないようで、ページャーにcatを指定しています。

投稿2021/12/31 12:06

Sheldonlovest

総合スコア4

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問