- ベストアンサー
外部ファイルから一部分を書き出したい
* * 固定文字 * ファイル名1 * [改行] * * 固定文字 * ファイル名2 * [改行] ・・・(以下同様) 上のようなテキストファイルがあります。 これのファイル名1,2,...だけ取り出して 別のファイルに保存したいのですが、 どのようにすればよいでしょうか? *は文字数が変わる文字列を意味します。 *はスペースを含みません。 ファイル名は文字数が変化し、その前後には スペースが入ります。 固定文字はどの行も同じ文字が入っているので これを基準に、プログラムを書けばよいと 思うのですが、分かりません。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
フォーマットが決まっているスペース区切りのデータファイルを扱う時は、fgets で1行読み込み、sscanf で必要な部分を取り込むのがセオリーです。 while (fgets(buf, buf_size, fin)) { sscanf(buf, "%*s %*s %*s %*s %s", filename); fprintf(fout, "%s\n", filename); } ※buf, filename は char配列として、それぞれに十分なサイズを取ってください。 ※buf_size には、buf の長さを指定してください。 ※fin, fout は、それぞれ読み込むファイル、ファイル名を出力するファイルのファイルポインタです。 sscanf のフォーマット指定の %*s は、そのデータは読み飛ばす(変数に格納しない)という指定です。 先頭から4個分の文字列を読み飛ばし、5番目のファイル名を filename に読み込みます。
その他の回答 (4)
- mcWalker
- ベストアンサー率69% (27/39)
自分ならこうする。 #include <stdio.h> #include <string.h> #define BUFSIZE 1024 // 数は仮 .... FILE *infd, *outfd; char *p, *pp, buf[BUFSIZE+1], *str=" 固定文字 "; // 前後にspaceを付ける .... /* file open 省略 */ /* 以下、インデントは全角スペースなので要注意 */ .... while(fgets(buf, BUFSIZE, infd)){ if ((p = strstr(buf, str)) != NULL){ p += strlen(str); if ((p = strchr(p, ' ')) != NULL){ p++; // ファイル名の先頭 if ((pp = strchr(p, ' ')) != NULL){ *pp = '\0'; // buf 破壊 // 書き出し方は仮 fprintf(outfd, "%s\n", p); } } } } // while(fgets(...)) exit .... /* file close 省略 */ .... または、DOS コマンドライン分解ルーチン getarg() が あるなら、buf をこれに通すと、argv[4] がファイル名を 指すので、これを書き出す。 argc >= 6 を条件にする。
お礼
プログラム的にポインタを使用しているようで 私には難しすぎますが、他の方の参考になると思います。 ご回答ありがとうございました。
- cojirou
- ベストアンサー率50% (59/117)
もしも、ファイル名の前後以外のところに1つも スペースが入らないのであれば、 1行読み込み→1文字ずつスペースと比較(スペースで なければ次の文字へ)→スペース文字があったら、 (次のスペースがくるまで)それ以後の文字を 別の文字列にコピー→次のスペースがきたらその行の 処理は終了→次の行の処理へ と繰り返せばできるかも。 もっと楽なやり方があるかもしれませんが、 ご参考までに。
- matyrcry
- ベストアンサー率47% (101/213)
*がスペース以外のどんなものにでもなるのなら、 固定文字列と重なるかもしれないので他のものを 基準にしたほうがいいです。 区切り文字が半角スペースで、他部には使われてい ないとすれば、4つ目のスペースの直後から次のス ペースまでと見て1行毎の文字列の頭から検索すれ ばいいと思います。 僕はVCでログファイルを作るときには、 fopen(),fseek(),fgets(),fputs(),fclose() をよく使ってます。
- taka_tetsu
- ベストアンサー率65% (1020/1553)
考え方としては、fgetsで1行読み込んで、strstrで固定文字を検索し、ファイル名の先頭位置を検索し、切り出す。 なんだろうけど、固定文字とファイル名の間と、ファイル名と改行の間に*があるからだめなんじゃない?
お礼
fgetsとsscanfでこんなに簡単に実現できるんですね。 このプログラムで、思いどうりのことが出来ました。 ご回答ありがとうございます。