- ベストアンサー
ファイルの読み込み・書き込み
fscanfを使えば書式付でファイルを読み込めるのは分かっているのですが、例えば、次のようなファイルがあったとして、 ファイルA 1行目:192.168.5.4 2行目:165.85.465.23 ・ ・ ・ 10行目:65.23.45.6 この2行目だけを書式付で読み込ませたりなど特定の行を読み込ませるにはどうしたらよいでしょうか? また、10個のデータがあったとして、1行目にこのデータを書き込み、次のデータを2行目・・・などとする方法も教えてください。できれば、軽い解説や参考URLなどがあると助かります。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
固定長なら可能です。 具体的にはIPアドレスを0埋めします 192.065.023.054 としていれば2行目が何バイト目から始まるのかがわかるので fopenならbinaryでオープンしてfseekで移動し、 そこから2行目の先頭から読み込み書込みが可能です。 しかし 1行目:192.168.5.4 2行目:165.85.465.23 のような可変長では2行目は何バイト目からはじまるか決まっていません。 1.1.1.1(7文字)なら7バイト+改行コードcrlf(2バイト)で 10バイト目が2行目ですが、1行目が 10.10.10.10(11文字)かもしれませんし255.255.255.255(15文字)かもしれません。 挿入も不可能です。 なぜなら、3行目以降がすべてずれこんでしまう可能性があるためです。 ですからこの場合はシーケンシャルサーチ(先頭から順番に読み込む)しか ありません。
その他の回答 (2)
- inetd
- ベストアンサー率23% (43/184)
> また、10個のデータがあったとして、 > 1行目にこのデータを書き込み、次の > データを2行目・・・などとする方法も > 教えてください。 この質問については意味がよく分かりません。 「このデータを書き込み」の「この」は何を 指しているんですか? というか、何をしたいんでしょうか? ファイルAの1行目を削除したいということ?
補足
すいません、説明不足でしたので補足します。 例えば、 ファイルA 192.1.2.3(1行目) 192.65.23.54(2行目) ・ ・ ・ 上記のファイルAにIPアドレスが10個あったとして、それを上から順に読み込ませるのではなく、3行目からいきなり読み込ませたりすることができないかというのがまず一つ目の質問で、二つ目の質問がプログラムの処理で 100.56.2.3 12.3.4.6 ・ ・ ・ などのように10個のデータを作ったとして、それをファイルBに書き込ませたいのですが、 ファイルBに 100.56.2.3 12.3.4.6 ・ ・ ・ というふうにIPアドレスを1行ずつ書き込ませる方法を教えていただきたいのですがよろしくお願いします。
- inetd
- ベストアンサー率23% (43/184)
fscanf() を使うよりも fgets() を使って1行づつカウントしながら読み込んで、カウントが目的の値になったら sscanf() でフォーマットに従って変数に入れた方が良いと思います。 例) FILE *fp; char buf[100]; int count = 0, a, b, c, d; if ((fp = fopen("testfile.txt", "r")) == NULL) { perror(NULL); exit(1); } while (fgets(buf, sizeof(buf), fp)) { count++; if (count == 2) { /* 2行目なので処理を書く。 */ /* たとえばこんなのとか */ sscanf(buf, "%d.%d.%d.%d", &a, &b, &c, &d); printf("%d.%d.%d.%d\n", d, c, b, a); . . . break; /* ここでは2行目以降は処理しない * のでループを抜ける。 */ } } fclose(fp);
お礼
fgetsやsscanfの使い方をもっと勉強してみようと思います。親切に回答していただきありがとうございました。
お礼
固定長なら可能なんですね!わかりやすい解説をしていただきありがとうございました。