• ベストアンサー

ファイルから1行ずつ読み込み

とても基礎なことかもしれませんが、質問させてください。 あるファイルに 1 23 3 4 53 3 32 89 7 4 5 3 4 3 4 5 6 7 といった数字の列が入っていて、 それを1行ずつ、読み込み、配列A[]に代入するにはどうすればよいでしょうか? 例えば上の例では、 A[0]には1、A[1]には23、A[2]には3・・・という感じで代入して処理を行った後、2回目は A[0]には32、A[1]には89、A[2]には7・・・ として処理を行う、といった作業を繰り返したいです。 for (i=0;;i++){  fscanf(fp,"%d",&j);  if(j == '\n') break;  s[i] = j; } としたのですが改行が判別できないらしく、1行はなく最後まで読み込まれてしまいます。

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

  • ベストアンサー
  • a-saitoh
  • ベストアンサー率30% (524/1722)
回答No.2

案1 ANo1.で説明されているように、まじめにやる。 案2 1行の最後の数の後に(空白が挟まることなく)改行が来るのなら、こういう手も使える。 char ch; for (i=0;;i++){   fscanf(fp,"%d%c",&j, &ch);   if(ch == '\n') break;   s[i] = j; } 案3 空白/改行の読み飛ばしをscanfに行わせずに自分でやる。 だいたいこんなかんじ。 int ch; for (i=0;;i++){  fscanf(fp,"%d",&j);  s[i] = j; do{ ch=getc(fp); }while(isspace(ch)&& ch!='\n'); if(ch=='\n') break; ungetc(ch,fp); } これに加えて、EOFが来たところで抜ける処理が必要です。 なお、ファイルに数字と空白と改行以外の文字は絶対に入ってない(タブも入ってない)のなら、 }while( ch==' '); でいいとおもいます。

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

その他の回答 (1)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

fgets などで一行単位でファイルから読込み 配列には、読み込んだ1行からsscanf してはどうでしょうか

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

関連するQ&A

  • C言語 文字列格納

    テキストファイルから整数データ又は文字列を読み込んで配列に格納する動作についての質問です。 テキストファイルが1行区切りの整数型なら1次元配列で for(i = 0; i < maxSize; i++) { fscanf(fp,"%d", &data[i]); } テキストファイルが1行区切りの文字列なら2次元配列で for(i = 0; i < MAXSIZE; i++) { if (fscanf(fp,"%s", &data[i][300]) == EOF) break; } for(j = 0; j < i; j++) printf("%s\n", data[j]); みたいな具合に格納できたんですが、 テキストファイルが1行区切りのデータではなく、空白文字区切りの文字データだった場合、それぞれどのようにして配列に格納すればいいかがわかりません。 イメージとしては、1文字目から見ていって空白が出ればそこで切って格納していくというかんじなのですが・・・ 質問の内容がわかりにくいかもしれませんが、是非教えてください。お願いします。

  • ネットワーク型データベースの構築

    C言語でネットワーク型のデータベースの構築を行っています。 そこで、住所録のデータベースなどで、『氏名 住所 電話番号』をfscanfで読み込みこんでみたのですが巧くいきません。 以下のような感じで作ってみたのですが・・・ fp=fopen("jyusyo.database","r"); fscanf(fp,%d",&num_data); for(i=0;i<num_data;i++){ j=0; while(1){ fscanf(fp,"%c",&tmp[i][j]); if(strcmp(&tmp[i][j],"\n"==0){ break; }else{ j++; } printf("%s\n",tmp[i]); } 他のやり方でもいい方法があれば教えてください!! よろしくお願い致します。

  • 行ごとにファイル結合

    下記プログラムは、input1.txtの内容 0 1 2 3 4 5 6 7 8 をファイル入力して、行番号とファイルの内容を表示できるように作成したものです。 このプログラムにinput2.txt 9 10 11 12 13 14 とinput3.txt 15 16 17 をファイル入力し、行ごとに結合して 0 0 1 2 9 10 15 1 3 4 5 11 12 16 2 6 7 8 13 14 17 と表示できるようにしたいのですが、どのようにすればよいのでしょうか。ご存知の方、お手数ですが教えてください。よろしくお願いします。 #include <stdio.h> main(){ int i,j=0,N=0,n,a[100],m=0; FILE *fpi; if((fpi=fopen("input1.txt","r"))==NULL){ fprintf(stderr,"ファイルを開けません。\n"); exit(1); } while(fscanf(fpi,"%d",&a[N])!=EOF && N<100){ N++; } n=N/3; printf("%d",m); for(i=0;i<N;i++){ printf(" %2d",a[i]); j++; if(j==n && m<n-1){ printf("\n"); m++; printf("%d",m); j=0; } } fclose(fpi); }

  • C言語 ファイルの読み込みについて

    以下のようなプログラムを実行します \nで改行が行われません。なぜでしょうか? #include <stdio.h> void main () { FILE *fp; double a, b; int count=0; fp = fopen("arm_x.csv","r"); while(1) { fscanf(fp,"%lf%lf\n",&a,&b); printf("%f::%f\n",a,b); count++; if(count==10)break; } fclose(fp); } csvファイルは 0.0 0.1 0.2 0.3 0.4 0.5 0.1 0.2 0.3 0.4 0.5・・・ 0.2 0.3 0.4・・・・・・・・・ : : です。 実行結果はこのようになってしまいます。 0.0 0.1 0.2 0.3 0.4 0.5 : :

  • 非常にはずかしい質問ですが 配列の質問です。

    C言語の勉強で時間が経つごとに、肝心の基礎が忘れがちになるのですよね。 それに、配列に対しての説明ってほとんど文字列ばかりで整数はみつからないです。 今回の質問は ・int型配列の要素ひとつずつ代入するにはどうするか? ・同じ数字を代入させないにはどうするか? ・配列中n個の要素を表示させるにはどうするのか? 条件 1、配列の要素はn個 2、同じ数は× 一応かいてみました。 { int buffer[6], i, j, signal ; srand((unsigned int)time(NULL)); for( i = 0 ; i < 6 ; i++){ buffer[i] = rand()%42+1; for( signal = 0 , j = 0 ; j < i ; j++ ){ if(buffer[i] == buffer[j]){signal = 1; break;} } if(signal == 0){break;} } printf("%d\n",buffer);

  • ある行が探索できない

    すいませんが、前回同じような質問をしましたが、再度質問します。文字列の探索で、 printf("Input Filename..."); scanf("%s",fname); while(1){ fp = fopen(fname, "r"); if(fp == NULL){ printf("ファイルを開くことができません...\n"); printf("Input Filename..."); scanf("%s",fname); }else break; } // fscanf(fp,"%s",fname); //1行目以外のみ可能 // fread(s1, 1000, 1000, fp); //上記 // s1 = fgetc(fp); fgets(s1, 10000, fp); //1行目のみ可能 // s1 = fscanf(fp); // s1=fp; // printf("文字列1を入力してください:"); // scanf("%s",s1); printf("文字列2を入力してください:"); scanf("%s",s2); cp = strstr(s1, s2); if(cp == NULL) printf("%sに%sのいずれの文字も含まれない.\n", s1, s2); else printf("%sの中に現れる%sという文字列は%d文字目にある.\n", s1, s2, cp - s1 + 1); free(s1); free(s2); というプログラムを作ったのですが、仮に3行のテキストファイルを読み込ませると、コメントの通り、 fscanf(fp,"%s",fname); //1行目以外のみ可能 fread(s1, 1000, 1000, fp); //上記 とすると、2,3行目のみが探索出来て、 fgets(s1, 10000, fp); //1行目のみ可能 とすると、1行目のみが探索可能になっています。 すべての行を探索可能にするにはどうすれば良いか教えてください。

  • 【C言語】ファイルを読み込んで16進数で表示する

    ファイルをバイナリモードで読み込んで16進数で表示するプログラムについて質問です。 以下の処理内容が理解できません。どのような処理を行っているのでしょうか?? (xdump.c)********************************* #include <stdio.h> #include <stdlib.h> int main(int argc, char **argv) { int i, j; FILE *fp; if(NULL == (fp = fopen(argv[1], "rb"))) { fprintf(stderr, "Cannot open FILE[%s].\n", argv[1]); exit(1); } for(i=0; i<0x7FFF; ++i) { printf("%08X :", ftell(fp)); for(j=0; j<16; ++j) { int c; c = 0x00FF & getc(fp); if(ferror(fp)) { puts("\a>>>> Read Error ! <<<<"); break; } if(feof(fp)) break; /* 16進数で表示 */ printf(" %2X", c); } printf(" : %08X\n", ftell(fp)-1); /* : */ /* : */ /* 以下省略 */ ****************************************** 上記に関して、 最初のfor文から"c = 0x00FF & getc(fp);"までの処理内容が よくわかりません。どなたかご教授願えますでしょうか?

  • 複雑なファイルの読み取り

    あるファイルからある文字と数字を読み取りたいのですがうまくいきません。 ファイル(例) A01 B02 C03 A02 B01 A03 B03 C05 A04 C04 というファイルを読み込ませ、2行目のようにCがなければ1つ前の行のCをBがなければ1つ前のBをつかうようにしたいのですが、どうしたらいいのかわかりません。 ちなみに初心者ですので本を見ながら下記のようなところまで作ってみました。 データを検索して数値を入力 printf("A,B,Cの順で入力してください(大文字で)--"); gets(search1); gets(search2); gets(search3); while (1){ fseek(fp,RECORDLEN * no++,SEEK_SET); if(fscanf(fp,"%s",b) == EOF) break; if(strstr(b,search1) != NULL){ find++; fscanf(fp,"%s",e); fscanf(fp,"%s",d); printf("A=%s\n",b); printf("B=%s\n",e); printf("C=%s\n",d); } } いまの状態で検索すると最後の行などではBのところにCが入ったりします。どうすればうまくいくでしょうか。どなたか回答のほうをよろしくお願いします。

  • ファイル入出力について教えて下さい。2

    ご覧いただきありがとうございます。 何度も低レベルな質問で申し訳ありません。 A.PRMというファイルに、 I have a pen. He has a pen. と2行の文章が入っています。 これを読み取り、printfで画面表示させたいのですが、 #include <stdio.h> int main(void) { FILE *fp; char a[50]; char b[50]; if( (fp=fopen("A.PRM", "r" )) != EOF ) { fgets( a, 49, fp ); fgets( b, 49, fp ); } fclose( fp ); printf( "a = %s\n", a ); printf( "b = %s\n", b ); return 0; } とすると、fgetsで余分な改行が入ってしまいます。 fgetsの代わりにfscanfを使用すると、今度はスペースの前までしか読み込んでくれず、「a = I」「b = He」と表示されてしまいます。 どうしたらよいでしょうか? 是非ご回答いただきたいです。よろしくお願いいたします。

  • ファイル操作

    あるファイルから長さの違った数字や文字を読み込んで配列に格納したいのですが数字などの長さが違うとなんかおかしくなってしまいます; 例えば 1 a 1 2 a 2 3 b 3 4 b 4 などのファイルはできるのですが 0 1 2 3 a 3 4 b 4 5 c 5 の場合5つの配列に格納したいのです。1行目で1つ2行目で1つ3行目の 左、真ん中、右の数字でそれぞれ1つづつ格納したいのです。 それで自分でやったのですが typedef struct path{ int left [100]; int right[100]; char center [100]; }Path; int main(int argc,char *argv[]) { FILE *fp; Path path; int i=0; int first; int second[100]; fp = fopen(argv[1],"r"); while(fscanf(fp,"%d %c %d",&path.left[i],&path.center[i],&path.right[i])==3){ i++; } fclose(fp); このようにやると3行目からはきちんとよみこむのですが1、2行目がうまくできません@@; firstとsecondのそれぞれ1、2行目を入れたいのです。 fscanfをもう1つ増やすしてもやってみましたがうまくいきませんでした。 ちなみにfscanf関数のところをならったばかりです。 fgetcとかそのようなのを使うのでしょうか?(よくわからないですけど) よろしくお願いします。ちなみにLinuxでgcc、C言語です。

このQ&Aのポイント
  • Windows10を使用している方で、スマートビジョンの録画ができない問題について説明します。
  • 予約した録画が実行されず、テレビが映らないというエラーが発生しているようです。
  • 再起動や予約の順序によっては解決する場合もありますが、原因が不安定な受信状態にある可能性もあります。
回答を見る