C言語ファイル入力方法とは?

このQ&Aのポイント
  • C言語のファイル入力について教えてください。
  • 入力ファイルinput2.txtを読み込み、最初の3行を無視して数値を配列に格納し、表示するプログラムを作成したいです。
  • お手数ですが、最初の3行を無視する方法を教えていただけませんか?
回答を見る
  • ベストアンサー

ファイル入力方法(C言語)

C言語のファイル入力について教えてください。 入力ファイルinput.txtが以下である時、 *********** abcdefg *********** 2 3 5 6 3 8 1 7 ●最初の3行を無視する ●4行目以降の数値を配列に格納し、表示する (4行目以降は2列で固定、行数は最大100列) 以上の条件でプログラムを作成したいのです。 最初の3行がない入力ファイルinput2.txt 2 3 5 6 3 8 1 7 を入力し、表示するソースコードは以下のように作成できましたが、「最初の3行を無視する」方法が分かりません。 お手数ですが、ご存じの方教えてください。 よろしくお願いいたします。 #include <stdio.h> #include <stdlib.h> int main() { int i,N,a[100],b[100]; FILE *fpi; if((fpi=fopen("input2.txt","r"))==NULL) { fprintf(stderr,"ファイルを開けません\n"); exit(1); } for (N=0; N<100 && fscanf(fpi,"%d %d",&a[N],&b[N]) != EOF; N++); printf("データ行数:%d\n\n",N); for(i=0;i<N;i++) { printf("%d %d\n",a[i],b[i]); } fclose(fpi); return 0; }

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

  • ベストアンサー
  • mori-yan
  • ベストアンサー率100% (1/1)
回答No.2

こんなのでどう? char s[256]; int N = 0; while (fgets(s, 256, fp) != NULL) { sscanf(s, "%d %d", &a[N], &b[N]); if (N < 3)   continue; N++; printf("データ行数:%d\n\n",N); }

eliteyoshi
質問者

補足

ご回答ありがとうございます。 以下のように作成したらできました。 問題ありましたら、ご指摘お願いします。 #include <stdio.h> #include <stdlib.h> int main() { int i,cnt=0,N=0,a[100],b[100];  //cnt:総行数,N:4行目以降データ数 char s[256]; FILE *fpi; if((fpi=fopen("data_goo2.txt","r"))==NULL) { fprintf(stderr,"ファイルを開けません\n"); exit(1); } while (fgets(s, 256, fpi) != NULL) { cnt++; if(cnt>3) { sscanf(s, "%d %d", &a[N], &b[N]); N++; } } printf("総行数:%d\n",cnt); printf("データ行数:%d\n\n",N); for(i=0;i<N;i++) { printf("%d %d\n",a[i],b[i]); } fclose(fpi); return 0; }

その他の回答 (5)

  • wormhole
  • ベストアンサー率28% (1619/5653)
回答No.6

>fgetsで大丈夫ですか? fgets()の仕様を確認しましょう。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.5

1行の長さに制限はありますか? fgets では「必ず 1行読み込める」ことを保証していないのですが....

eliteyoshi
質問者

補足

ご回答ありがとうございます。 入力ファイルは1行当たり最大60文字です。 fgetsで大丈夫ですか?

  • yama5140
  • ベストアンサー率54% (136/250)
回答No.4

>「最初の3行を無視する」方法が分かりません。 ・単純に、冒頭3行を「読み捨て」ればいいと思います。 質問文に示されたソースに、 char s[ 256 ]; を加え、 fgets( s, 256, fpi ); fgets( s, 256, fpi ); fgets( s, 256, fpi ); の3行を、「ファイルオープンエラー処理」の後に追加してみてください。 +++++++++++++++++++++++++ なお、質問文に示されたソースはスマートとは言えない(失礼)と思います。 #2 補足に示されたソースに同様の対応(↑単純読み捨て)をすればよいと思います。 ( cnt そのもの及び関するロジックが不要となり、「総行数」は、( N + 3 ) とすればよいかと・・)

eliteyoshi
質問者

お礼

ご回答ありがとうございます。 スマートなコードが書けなくて恥ずかしいばかりです。 教えていただいた通り、下記の様にしたらできました。 #include <stdio.h> #include <stdlib.h> int main() { int i,N,a[100],b[100]; char s[ 256 ]; FILE *fpi; if((fpi=fopen("input.txt","r"))==NULL) { fprintf(stderr,"ファイルを開けません\n"); exit(1); } fgets( s, 256, fpi ); fgets( s, 256, fpi ); fgets( s, 256, fpi ); for (N=0; N<100 && fscanf(fpi,"%d %d",&a[N],&b[N]) != EOF; N++); printf("データ行数:%d\n\n",N); for(i=0;i<N;i++) { printf("%d %d\n",a[i],b[i]); } fclose(fpi); return 0; }

  • asuncion
  • ベストアンサー率33% (2126/6286)
回答No.3

>sscanf(s, "%d %d", &a[N], &b[N]); 最初の3行のフォーマットがこれとは異なっているので、 何かしら不都合が起きるような気がします。 4行目以降だったら、この方法でかまわないように思います。

  • asuncion
  • ベストアンサー率33% (2126/6286)
回答No.1

1行読むたびに行数をカウントして、 「行数が3以下だったら何もしない」という ロジックを組み込む。

eliteyoshi
質問者

補足

ご回答ありがとうございます。 以下のように作成しました。入力ファイルは7行目までですが、8行目?まで読み込んでしまいます。 (7つ目の改行を読み取った後、1行分余計にデータ入力している) どこが問題なのでしょうか? #include <stdio.h> #include <stdlib.h> int main() { int i,N=0,a[100],b[100]; int c,cnt=0; FILE *fpi; //cnt:総行数,N:4行目以降データ数 if((fpi=fopen("input.txt","r"))==NULL) { fprintf(stderr,"ファイルを開けません\n"); exit(1); } if(fpi) { while((c = getc(fpi)) != EOF) { if(c == '\n') { cnt++; } if(cnt>=3) { fscanf(fpi,"%d %d",&a[N],&b[N]); N++; } } } printf("総行数:%d\n",cnt); printf("データ行数:%d\n\n",N); for(i=0;i<N;i++) { printf("%d %d\n",a[i],b[i]); } fclose(fpi); return 0; }

関連するQ&A

  • ファイル入力方法

    いつもお世話になります。C言語のファイル入力について教えてください。 入力ファイルinput.txtの内容が以下の時、 ----------- abcdefg ----------- 2 3 5 6 3 8 1 7 ----------- ABCDEFG ----------- (1)最初の3行を無視する (2)4行目からの数値データを配列に格納する (3)数値データは最大100行、2列固定 (4)8行目の-----------以降は無視する 以上の条件でプログラムを作成したいのです。(1)(2)(3)の条件は下記のソースコードに入っていますが、(4)の処理の仕方がわかりません。 申し訳ありませんが、教えてください。よろしくお願いします。 #include <stdio.h> #include <stdlib.h> int main() { int i,cnt=0,N=0,a[100],b[100]; char s[256]; FILE *fpi; if((fpi=fopen("input.txt","r"))==NULL){ fprintf(stderr,"ファイルを開けません\n"); exit(1); } while(fgets(s,256,fpi) != NULL){ //printf("%s",s); cnt++; if(cnt>3){ sscanf(s,"%d %d",&a[N],&b[N]); N++; } } printf("データ行数:%d\n\n",N); for(i=0;i<N;i++){ printf("%d %d\n",a[i],b[i]); } fclose(fpi); return 0; }

  • 行ごとにファイル結合

    下記プログラムは、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); }

  • ファイル入力方法

    下記の様な入力ファイルinput.datの空行までを出力する(空行以降は無視)プログラムを作ろうとしています。 11 12 13 14 15 16 17 18 19 20 21 22 1001 23 24 25 26 下記のようなソースを作成しましたが、入力が空行で止まってくれません。 どのように修正すればよいのでしょうか? 大変お手数ですが、教えてください。よろしくお願いします。 #include <stdio.h> #include <stdlib.h> int main() { int i,N,a[10][20]; FILE *fpi; if((fpi=fopen("input.dat","r"))==NULL) { fprintf(stderr,"Cannot open file input.dat\n"); exit(1); } N=0; for(i=0 ; i<10 && fscanf(fpi,"%d %d %d %d",&a[i][0],&a[i][1],&a[i][2],&a[i][3]) != 3 ; i++) { N++; } printf("N=%d\n",N); for(i=0;i<N;i++) { printf("%d %d %d %d\n",a[i][0],a[i][1],a[i][2],a[i][3]); } fclose(fpi); return 0; }

  • ファイル入力の仕方

    下記のような入力ファイル(input.txt)を配列に格納するプログラムを作成しています。 下のソースコードは行数・列数が一定の場合のものですが、実際の入力データは行数・列数とも不定です。つまり、行数・列数をプログラムで読み取らなければなりません。この場合、ソースコードをどのようにすれば良いのでしょうか? 大変お手数ですが、教えてください。よろしくお願いします。 x y1 y2 y3 y4 10.0 1.2 1.5 1.0 2.1 10.5 1.3 1.4 1.2 2.2 11.0 1.8 1.2 2.2 3.1 11.5 2.1 1.0 1.2 4.5 12.0 1.9 1.1 1.1 5.5 13.0 2.4 1.1 2.1 4.2 ・1行目をchar型配列に格納したい。 ・2行目以降はdouble型配列で1列目をX[]、2列目以降をY[][]に格納したい。 ・行数は20(2行目以降)まで、列数は10(2列目以降)まで #include <stdio.h> #include <stdlib.h> int main(){ int i,j; double X[20],Y[20][4]; char x[2],y[10][4]; FILE *fpi; if((fpi=fopen("input.txt","r"))==NULL){ fprintf(stderr,"Cannot open file.\n"); exit(1); } fscanf(fpi,"%s %s %s %s %s",x,y[0],y[1],y[2],y[3]); printf("%s %s %s %s %s\n",x,y[0],y[1],y[2],y[3]); for(i=0;i<6;i++){ fscanf(fpi,"%lf",&X[i]); printf("%4.1lf ",X[i]); for(j=0;j<4;j++){ fscanf(fpi,"%lf",&Y[i][j]); printf("%4.1lf ",Y[i][j]); } printf("\n"); } printf("\n"); return 0; }

  • ファイル入力方法について

    下記の入力ファイルinput.datの内容を出力するプログラムを作っています。 ・1001,1002,・・・はデータ番号 ・データ番号の下は、行数1~20,列数4のデータ ・「DATAEND」で入力停止 1001 aa bb 01 02 cc dd 03 04 1002 ee ff 05 06 gg hh 07 08 ii jj 09 10 1003 kk ll 11 12 mm nn 13 14 DATAEND データ番号なしの入力データを出力するソースが下記のものです。データ番号が入った入力データではうまくファイル入力できません。 大変お手数ですが、教えてください。よろしくお願いします。 #include <stdio.h> #include <stdlib.h> int main(){ int i,j,n=0,N=0,num[20],c[10][20],d[10][20]; char str[20][100],a[10][20][5],b[10][20][5]; FILE *fpi; if((fpi=fopen("input.dat","r"))==NULL){ fprintf(stderr,"Cannot open file input.dat\n"); exit(1); } for(i=0;i<10;i++){ for(j=0;j<20;j++){ fgets(str[i],sizeof(str[i]),fpi); if(sscanf(str[i],"%s %s %d %d",a[i][j],b[i][j],&c[i][j],&d[i][j]) != 4){ break; } n++; } num[i]=n; n=0; if(num[i]==0){ break; } N++; } for(i=0;i<N;i++){ for(j=0;j<num[i];j++){ printf("%s %s %d %d\n",a[i][j],b[i][j],c[i][j],d[i][j]); } printf("\n"); } fclose(fpi); return 0; }

  • C言語(データ数の読み取り)

     input.txtというファイルの内容が 2 5 3 だとして、この3つの数字の最大値を求める以下のプログラムをコンパイルして実行すると、ファイルを読み込む前にデータ数「3」を入力しなければなりません。  データ数を入力することなくファイルからデータ数を読み取る方法を教えてください。大変お手数ですが、よろしくお願いします。 #include <stdio.h> main() { int i,max,max_no,N,a[1000]; FILE *fpi; printf("データ数を入力してください: "); scanf("%d",&N); if((fpi=fopen("input.txt","r"))==NULL) { fprintf(stderr,"ファイルを開けません\n"); exit(1); } for(i=0;i<N;i++) { fscanf(fpi,"%d",&a[i]); } max_no=0; max=a[max_no]; for(i=1;i<N;i++) { if(a[i]>max) { max=a[i]; max_no=i; } } printf("最大値は %d 番目のデータ %d です。\n",max_no+1,max); }

  • C言語初心者です。

    #include <stdio.h> int main() { int b[100]; int i, n; int a, r, data; int count=0; printf("Please input two integers:"); fflush(0); scanf("%d %d", &a, &r); if(a<=0 || r<=1){ printf("Error\n"); } else{ for(n=0; b[n]<=80.0; n++){ if(n==0){ b[0]=0; count++; } else { for(i=0; i<=n-1; i++){ data*=r; } b[n]=a*data; printf("%d ", b[n]); count++; } } printf("\n"); for(; count>0; count--){ printf("%d ", b[count]); } } return 0; } windows8でeclipseを使ってC言語を書いてます。 eclipse上だと何もエラーが表示されてないのですが、実行し、 Please input two integers: と表示された後、適当な数字2つを入力しても何も反応しません。 稚拙な質問ですいません。どなたか原因を教えてください。

  • 入力ファイルのデフォルトの設定

    下のソースは入力ファイルの内容が例えば、 1 2 3 4 5 6 7 8 の時にその内容を出力するものです。 入力ファイル名がinput.datの場合、プログラム実行後にinput.datと入力し、Enterを押します。 このプログラムにinput.datをデフォルトとし、空Enterで入力を実行できるようにしたいと考えています。 入力ファイル名がinput.datでない場合は従来通りファイル名を入力してEnterを押すようにします。 この場合、どのようにソースを変更すればよいでしょうか。お手数ですが、教えてください。よろしくお願いします。 #include <stdio.h> #include <stdlib.h> int main(){ int i,N=0,data[10]; char ifile[20]; FILE *fp; printf("input file name: "); scanf("%s",ifile); if((fp=fopen(ifile,"r"))==NULL){ fprintf(stderr,"input file error\n"); exit(1); } while(fscanf(fp,"%d",&data[N])!=EOF && N<10){ N++; } printf("Total Number of Data = %d\n",N); for(i=0;i<N;i++){ printf("%d\n",data[i]); } fclose(fp); return 0; }

  • ファイル入力

    1 20 2 30 3 95 4 52 5 90 3 Maximum  上記の様な入力ファイルinput.datのうち1~5行目のデータを表示するプログラムを作っています。  6行目は空白で、7行目は2列目の中で最大値をとる行の1列目の数値が入っています。  1列目の数値は最後の行を除いて重複することはありません。  入力データの行数はファイルによって最大20行まで変動します。列数は2列で固定です。  以下のプログラムのままでは6行目以降のデータも読み取ってしまい、出力がおかしくなってしまいます。  1~5行目のデータのみ出力するにはどうしたらよいでしょうか。  ご存知の方、お手数ですが教えてください。よろしくお願いします。 #include <stdio.h> #include <stdlib.h> #define row 20 #define col 2 int main(){ int i,j,data[20][2]; FILE *fp; if((fp=fopen("input.dat","r"))==NULL){ fprintf(stderr,"Cannot open file input.dat\n"); exit(1); } for(i=0;i<row;i++){ for(j=0;j<col;j++){ fscanf(fp,"%d",&data[i][j]); printf("%d ",data[i][j]); } printf("\n"); } fclose(fp); return 0; }

  • C言語のソースコードについて教えてください。

    以下のソースコードを学習用C言語開発環境で行ったのですが、 『ファイル「C:/Users/ユーザー名/AppData/Local/EasyIDEC/project/タイトル/main.c」の 「41行目」で記述エラーを発見しました。 「,」を付け忘れています。』 という、コンパイルエラーが表示されました。 何度も見直したのですが、よくわかりません。 #include <stdio.h> int main(int argc, char *argv[]) { char answer ; answer = 'n' ; while(answer =='n') { int input ; input = 0 ; int add ; add = 1 ; int sum ; sum = 0 ; printf("数値を入力して下さい。:") ; scanf("%d", &input ) ; int i ; i = 0 ; while(i < input) { sum =sum + add ; printf("\n%d",sum) ; i++ ; add++ ; } printf("\n1から%dまでの総和は、%dです。" , input , sum) ; while(1) { printf("\n終了しますか? y/n:") ; scanf(" %c , &answer) ; if( (answer != 'y') && (answer != 'n') ) { printf( "y or nを入れてください。") ; } else { break ; } } } return 0 ; }