テキストファイルの処理についての質問

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
孝一
記事: 1
登録日時: 1ヶ月前

テキストファイルの処理についての質問

#1

投稿記事 by 孝一 » 1ヶ月前

添付ファイルtest.txtを読み込み、answer.txtに読み取られた単語とその出現回数を出力するプログラムを作りたいです。この単語の定義は下記の通りです。
「先頭文字がアルファベットであり、構成文字がアルファベット、アンダーバー、数字である文字列」
以下が期待されるファイルへの出力結果です。

wer ......1
qwe123 ......1
wer456 ......1
sw_qwe ......1
q12_12 ......1
A123B123 ......1
wsed_123 ......1
添付ファイル
test.txt.zip
(211 バイト) ダウンロード数: 36 回

dic
記事: 658
登録日時: 14年前
住所: 宮崎県
連絡を取る:

Re: テキストファイルの処理についての質問

#2

投稿記事 by dic » 1ヶ月前

私なりに作ると想定して、以下のステップにわけるとします。
1. test.txt の読み込み
2. test.txt の内容を 配列に読み込む
3. 配列から先頭文字を見つける
4. 「先頭文字がアルファベットであり、構成文字がアルファベット、アンダーバー、数字である文字列」をしぼりだし、連想配列に代入する
5. 終わりまで読み込み、4. の文字を対応する連想配列の値をインクリメントする
6. forループで、格納した連想配列と値を出力する
7. 終わり
としますが、なにぶん C言語は ん年ぶりなので、とても苦労します。

孝一さんは、どこまでできそうですか?
また、何を手伝ってほしいのか、プログラムの動作する環境、OSとかを書いてください。
そして、どこまでできたか、ソースコードをのせてください。

多分、C言語だとは思いますが、C++は使用してもいいのでしょうか?
それによって回答するソースコードも変わってくると思います。

c-genger

Re: テキストファイルの処理についての質問

#3

投稿記事 by c-genger » 1ヶ月前

組んでみました、参考になれば。

コード:

#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main(){
	enum{ DONE, E_SMALL_W, E_SMALL_WC, };

	struct{
		struct{ char w[64]; int  c; } wc[1024];
		int                           n;
	} wn = {};

	ungetc(' ', stdin);

	char buf[sizeof(wn.wc[0].w)];
	while((scanf("%63[^A-Za-z0-9_]", buf) == 1) && (scanf("%63[A-Za-z0-9_]", buf) == 1)){
		if(!isdigit(buf[0])){
			int i = 0;
			while((i < wn.n) && (strcmp(wn.wc[i].w, buf) != 0)) ++i;

			if(sizeof(wn.wc)/sizeof(wn.wc[0]) <= i) return E_SMALL_WC;

			if(i == wn.n){
				++wn.n;
				strncpy(wn.wc[i].w, buf, sizeof(wn.wc[i].w));
			}

			++wn.wc[i].c;
		}
	}

	if(getchar() != EOF) return E_SMALL_W;

	for(int i=0; i<wn.n; ++i){
		printf("%s ......%d\n", wn.wc[i].w, wn.wc[i].c);
	}

	return DONE;
}

コード:

% ./a.out < test.txt > answer.txt

返信

“C言語何でも質問掲示板” へ戻る