アプリ版:「スタンプのみでお礼する」機能のリリースについて

* * 固定文字 * ファイル名1 * [改行]
* * 固定文字 * ファイル名2 * [改行]
・・・(以下同様)

上のようなテキストファイルがあります。
これのファイル名1,2,...だけ取り出して
別のファイルに保存したいのですが、
どのようにすればよいでしょうか?

*は文字数が変わる文字列を意味します。
*はスペースを含みません。
ファイル名は文字数が変化し、その前後には
スペースが入ります。
固定文字はどの行も同じ文字が入っているので
これを基準に、プログラムを書けばよいと
思うのですが、分かりません。

A 回答 (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 に読み込みます。
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/06/05 18:07

自分ならこうする。



#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 を条件にする。
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/06/05 18:17

もしも、ファイル名の前後以外のところに1つも


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

*がスペース以外のどんなものにでもなるのなら、


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

考え方としては、fgetsで1行読み込んで、strstrで固定文字を検索し、ファイル名の先頭位置を検索し、切り出す。



なんだろうけど、固定文字とファイル名の間と、ファイル名と改行の間に*があるからだめなんじゃない?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!