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

fscanfを使えば書式付でファイルを読み込めるのは分かっているのですが、例えば、次のようなファイルがあったとして、

ファイルA
1行目:192.168.5.4
2行目:165.85.465.23



10行目:65.23.45.6

この2行目だけを書式付で読み込ませたりなど特定の行を読み込ませるにはどうしたらよいでしょうか?

また、10個のデータがあったとして、1行目にこのデータを書き込み、次のデータを2行目・・・などとする方法も教えてください。できれば、軽い解説や参考URLなどがあると助かります。

A 回答 (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行目以降がすべてずれこんでしまう可能性があるためです。
ですからこの場合はシーケンシャルサーチ(先頭から順番に読み込む)しか
ありません。
    • good
    • 0
この回答へのお礼

固定長なら可能なんですね!わかりやすい解説をしていただきありがとうございました。

お礼日時:2003/11/19 19:23

> また、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行ずつ書き込ませる方法を教えていただきたいのですがよろしくお願いします。

補足日時:2003/10/27 20:44
    • good
    • 0

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);
    • good
    • 0
この回答へのお礼

fgetsやsscanfの使い方をもっと勉強してみようと思います。親切に回答していただきありがとうございました。

お礼日時:2003/11/19 19:24

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