ページ 11

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

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

wer ......1
qwe123 ......1
wer456 ......1
sw_qwe ......1
q12_12 ......1
A123B123 ......1
wsed_123 ......1

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

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

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

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

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

Posted: 2025年2月02日(日) 11:46
by c-genger
組んでみました、参考になれば。

コード:

#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