• ベストアンサー

ファイルの読み込み・書き込み

fscanfを使えば書式付でファイルを読み込めるのは分かっているのですが、例えば、次のようなファイルがあったとして、 ファイルA 1行目:192.168.5.4 2行目:165.85.465.23 ・ ・ ・ 10行目:65.23.45.6 この2行目だけを書式付で読み込ませたりなど特定の行を読み込ませるにはどうしたらよいでしょうか? また、10個のデータがあったとして、1行目にこのデータを書き込み、次のデータを2行目・・・などとする方法も教えてください。できれば、軽い解説や参考URLなどがあると助かります。

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

  • ベストアンサー
  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.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行目以降がすべてずれこんでしまう可能性があるためです。 ですからこの場合はシーケンシャルサーチ(先頭から順番に読み込む)しか ありません。

20centuryboy
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • inetd
  • ベストアンサー率23% (43/184)
回答No.2

> また、10個のデータがあったとして、 > 1行目にこのデータを書き込み、次の > データを2行目・・・などとする方法も > 教えてください。 この質問については意味がよく分かりません。 「このデータを書き込み」の「この」は何を 指しているんですか? というか、何をしたいんでしょうか? ファイルAの1行目を削除したいということ?

20centuryboy
質問者

補足

すいません、説明不足でしたので補足します。 例えば、 ファイル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)
回答No.1

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);

20centuryboy
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ファイルからの読み込み

    fscanfを使ってファイルの中身を読み込みたいのですが、ファイルの中身の長さが統一されていない場合どうしたらよいでしょうか? 読み込むファイルの中身 A d 1 B 3 2 G 5 1 2 B 6 G H 5 2 5 今まではファイルの中身の各行の文字数が全部3つだったので fp=fopen(A.txt,"r"); while(fscanf(fp,"%s %s %s",data,data+1,data+2)!=EOF) { printf("%s?n",data); }としていました。わかりにくい文章ですいません。

  • C言語での、テキストファイル読み込みについて

    30行×30列の数字が記載されてテキストファイルがあり、 それをC言語で例えばA[ ][ ]といった配列に読み込みたいのですが、 どうすればよいでしょうか? fscanf関数を用いればできないことはないと思うのですが、 30個も書かなければならないのは冗長なので・・・。 なにかよい方法はありますでしょうか?

  • ファイルからの読み込み

    ファイルから文字を読み込むプログラミングについての質問です。 ファイルから文字を読み込んで出力したいのですが、ファイルの中身が 1 2 3 a c 3 5 6 ・・・ 1 4 y c d 4 のような感じになっています。各文字と文字の間はスペースで区切られており、2行目の文字はどこまで続くか分かりません。 この場合fscanf,fget関数を使ってファイルを読み込む時どのようなプログラムにしたら良いのでしょうか? 分かりづらい質問ですいません。

  • ファイル書き込みについて

     ファイルが2つあって、片方のファイル(以後、ファイル(1))を読み込んだものを、もう片方のファイル(以後、ファイル(2))に書き込みたいと思います。 ファイル(1) aaaaaa bbbbbb ccccccc dddddddd eee ファイル(2) aiueo kakikukeko  → ある特定の行:A行 sashisuseso  → B行 : papipupepo  → C行 gagigugego  → D行 ざじずぜぞ ナニヌネノ  ここまではわかるんですけど、ファイル(2)に書き込む時に、A行の次の行、B行からD行の前のC行までを一旦削除して、削除したその部分に書き込みたいんですけど、どうしたらいいでしょうか?

    • ベストアンサー
    • Perl
  • ファイル読み込みについて

    CまたはC++で、データごとにタブで区切られたテキストファイルを読み込む処理があります。 例) 項目1(タブ)fea 5310 a(タブ)2009(改行) 項目2(タブ)dc 6307(タブ)2012(改行) 項目3(タブ)beaf 23 t(タブ)2010(改行) fscanf で読み込もうとしたのですが、タブとスペースが同じように扱われてしまうようで、 スペースが含まれるデータがある場合、上手く読み込めませんでした。 結局、fgets で一行ずつ一時バッファに読み込んでから一文字ずつチェックして データごとに切り分けたのですが、釈然としません。 もっと簡潔な方法はないでしょうか?

  • ファイルの作成・書き込み・読み込みについて

    ファイルの取り扱いについて、どのように記述すればいいのかが分かりません。 分からないことが多いので(1)~(4)の質問に分けています、Cの勉強は趣味程度にしかできていないので、詳しくご回答いただけると嬉しいです。 自分なりに書いてみます、間違いがあればご指摘宜しくお願いします。 (1)Aを頭文字にして100個のcsvファイルを作成 (a1,a2…a100) char A[100] FILE *fp; for(i=1;i<101;i++) { snprintf(A,sizeof A,"A%d.csv",i); if((fp = fopen(A,"w"))!=NULL) {exit(1);} } (2)A1を開きデータを入れる、この動作を同様に2~100で繰り返す。 A1に入れたいデータはx,y,zで1000行 fp = fopen("A1.csv","a"); for(z=1;z<11;z++) { for(y=1;y<11;y++) { for(x=1;x<11;x++) { fprintf(fp,"%d,%d,%d\n",x,y,z); } } } fclose(fp); これでこんな感じに書き込まれるはず・・・ 1,1,1 2,1,1 3,1,1  ・  ・  ・ 10,10,10 これを同様に2~100のファイルに対して一気に行いたいですが、書き方が分かりません。 (3)再びA1を開きx=10,Y=10の時のzの値を知りたい。 こんな事はできるのでしょうか? もし無理なら~行目のデータを呼び出す (4)そしてA1を開きx=10,Y=10の時の、zだけを上書き。 長くなってすいません、分からない事だらけなので宜しくお願いします。

  • ファイルの読み込み

    a,b,c,d,e,f g,h,i,j,k,l のような1行に5つのデータがカンマで区切られ並んでいるテキストファイルがあります。(行数は決まっていません) これを読み込みリストビューに表示させたいのですが、うまくいきません。 誰かうまい方法を教えてください。

  • ファイルからデータの読み込み

    ファイルからデータを読み込みたいのですが。 VBAにてファイルから特定個所の列データを読み込み計算をおこなうプログラムを作成したいのですが、ファイルによってデータの数が異なるため、プログラム初心者なのでうまくプログラムを組むことができません。 参考のプログラムを教えていただけますか? よろしくお願いいたします。

  • ファイル読み込みが上手くできません

    C言語初心者です。 現在、ファイルの情報を構造体に読込んで実行するプログラムを作成しております。 読込むファイルは700MBほど(行数は39900000行)となっており、1行ずつfscanfで読込んでいます。 400000行ごとに構造体に読込んで、処理を実行し、構造体に読込んだ全ての処理が完了したら、再度400000行読込んで・・・を繰り返すものになっております。 400000行ごとにしているためforループで100回まわすようにしているのですが、最後の1回(100回目のループ)で、99回目と同じ場所を読んできてしまいます。 つまり、最後の1回だけはファイルポインタが進んでいない状況になります。 コードは下記になります。 #define MAX_SIZE 400000 uint64_t i = 0; uint64_t fc = 0; int main(int argc, char *argv[]){ char w[] = "$write"; char r[] = "$read"; // ファイルを構造体へ格納 char filename[] = "TEST_READ_WRITE.txt"; struct TEST_DATA{ char cmd[10]; int addr; int bsize; }; FILE *fp; if ((fp = fopen(filename, "r")) == NULL){ printf("%s open error !\n", filename); exit(1); } for (int lp = 0; lp < 100; lp++){ struct TEST_DATA TD[MAX_SIZE]; // 構造体配列の宣言 for (fc = 0; fc < MAX_SIZE; fc++) { if (feof(fp)){ break; } else{ fscanf(fp, "%s %d %d\n", TD[fc].cmd, &TD[fc].addr, &TD[fc].bsize); } } while (i < MAX_SIZE - 1){ //ファイルから取得したデータによって処理を実行 if (strcmp(TD[i].cmd, w) == 0){ //書込み処理 } if (strcmp(TD[i].cmd, r) == 0){ //読み込み処理 } } printf("Finish!! \n"); } fclose(fp); return 0; } 読込むファイルはテキストデータで、 $write 25651496 152 $write 135878112 8 $read 1244848 16 のような感じのものが39900000行並んでいるものになります(数字はランダムです)。 最後の1回のみ上手くファイルポインタが進まない原因が分からずに困っています。 お気づきの方がいらっしゃいましたら、アドバイスをよろしくお願いします。

  • MATLABのファイル読み込みに関して

    こんにちは,今回MATLABでのファイル読み込みに関して質問したいことがあり書き込みました 現在in_1-C110.txt,in_1-C120.txt,......in_1-C190.txt'というファイルがあり,これらのファイルをまとめて読み込もうとして以下のようなコードを記述しました for a=1:9 %ファイルを読む fin=fopen(['in_1-C1' a '0.txt'],'r');     %a A=fscanf(fin,'%f %f %f %f %f %f %f',[7 inf]); fclose(fin); (略) end このように,ファイル名の最初と最後は共通なので,異なる部分のみをループさせて連続して読もうとしています ところが,この方法だとInvalid fid.と出てしまいます 調べてみると、意図したものでは%aのところが in_1-C110.txt in_1-C120.txt となるはずだったのですが,fscanfを抜いてこのファイル名のところだけ書き出すようにしてみると in_1-C1(変な文字)0.txt in_1-C1(変な文字)0.txt といったような変数の部分が文字化けを起こしていることがわかりました. したがって,ファイルが読めない原因がこれにあるのだと推察したのですが,解決方法がまったくわからない状態です この問題を解決する方法がわかる方がおられましたら,教えていただけないでしょうか?