• ベストアンサー

外部ファイルから一部分を書き出したい

* * 固定文字 * ファイル名1 * [改行] * * 固定文字 * ファイル名2 * [改行] ・・・(以下同様) 上のようなテキストファイルがあります。 これのファイル名1,2,...だけ取り出して 別のファイルに保存したいのですが、 どのようにすればよいでしょうか? *は文字数が変わる文字列を意味します。 *はスペースを含みません。 ファイル名は文字数が変化し、その前後には スペースが入ります。 固定文字はどの行も同じ文字が入っているので これを基準に、プログラムを書けばよいと 思うのですが、分かりません。

質問者が選んだベストアンサー

  • ベストアンサー
  • leaz024
  • ベストアンサー率75% (398/526)
回答No.4

フォーマットが決まっているスペース区切りのデータファイルを扱う時は、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 に読み込みます。

apache6
質問者

お礼

fgetsとsscanfでこんなに簡単に実現できるんですね。 このプログラムで、思いどうりのことが出来ました。 ご回答ありがとうございます。

その他の回答 (4)

  • mcWalker
  • ベストアンサー率69% (27/39)
回答No.5

自分ならこうする。 #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 を条件にする。

apache6
質問者

お礼

プログラム的にポインタを使用しているようで 私には難しすぎますが、他の方の参考になると思います。 ご回答ありがとうございました。

  • cojirou
  • ベストアンサー率50% (59/117)
回答No.3

もしも、ファイル名の前後以外のところに1つも スペースが入らないのであれば、 1行読み込み→1文字ずつスペースと比較(スペースで なければ次の文字へ)→スペース文字があったら、 (次のスペースがくるまで)それ以後の文字を 別の文字列にコピー→次のスペースがきたらその行の 処理は終了→次の行の処理へ と繰り返せばできるかも。 もっと楽なやり方があるかもしれませんが、 ご参考までに。

  • matyrcry
  • ベストアンサー率47% (101/213)
回答No.2

*がスペース以外のどんなものにでもなるのなら、 固定文字列と重なるかもしれないので他のものを 基準にしたほうがいいです。 区切り文字が半角スペースで、他部には使われてい ないとすれば、4つ目のスペースの直後から次のス ペースまでと見て1行毎の文字列の頭から検索すれ ばいいと思います。 僕はVCでログファイルを作るときには、 fopen(),fseek(),fgets(),fputs(),fclose() をよく使ってます。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

考え方としては、fgetsで1行読み込んで、strstrで固定文字を検索し、ファイル名の先頭位置を検索し、切り出す。 なんだろうけど、固定文字とファイル名の間と、ファイル名と改行の間に*があるからだめなんじゃない?

関連するQ&A