• ベストアンサー

行ごとにファイル結合

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

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

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

全然違うかも… ---------------------------------------------------------- #include <stdio.h> #include <string.h> #include <stdlib.h> void main(void){ int n=0,i; char filename[16]; char buff[3][8]; char *nl; FILE *fp[3]; for(i=0;i<3;i++){ sprintf(filename,"input%d.txt",1+i); if(NULL==(fp[i]=fopen(filename,"r"))){ fprintf(stderr,"ファイルを開けません。\n"); exit(1); } } while(!feof(fp[0])){ for(i=0;i<3;i++){ if(NULL==fgets(buff[i],8,fp[i]))goto end; if(NULL!=(nl=strchr(buff[i],'\n'))) *nl='\0'; } printf("%d %s %s %s\n",n++,buff[0],buff[1],buff[2]); } end: fcloseall(); }

eliteyoshi
質問者

お礼

ご回答いただいたプログラムは非常に参考になりました。 おかげさまでなんとか理解することができました。 ありがとうございました。

その他の回答 (1)

回答No.1

入力ファイルのデータチェックをする必要がないのであれば、また、1行あたりのデータの数も固定であれば (主要部分のみ) int a, b, c; int d, e; int f; int count = 0; FILE *fp1 = fopen("input1.txt", "r"); FILE *fp2 = fopen("input2.txt", "r"); FILE *fp3 = fopen("input3.txt", "r"); while(fscanf(fp1, "%d %d %d", &a, &b, &c) == 3) { fscanf(fp2, "%d %d", &d, &e); fscanf(fp3, "%d", &f); fprntf("%d %d %d %d %d %d %d\n", count++, a, b, c, d, e, f); } こんなところです。

eliteyoshi
質問者

お礼

このようなやり方があるんですね。 僕でも十分に理解できました。 ありがとうございました。

関連するQ&A

  • ファイル入力方法(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; }

  • ファイル入力方法

    いつもお世話になります。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; }

  • ファイル入力方法

    下記の様な入力ファイル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; }

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

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

    下記の入力ファイル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; }

  • ファイル入力の仕方

    下記のような入力ファイル(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; }

  • Gaussの消去法のプログラムなんですがこれを利用して、消去法による行

    Gaussの消去法のプログラムなんですがこれを利用して、消去法による行列式の計算プログラムをつくりたいのですが難しくてよくわかりません。。。 教えていただきたいです。 困ってるのでよろしくお願いします。 int gauss(double *x, double *a, double *b, int n) { int i,j,k,m; double tmp,p,sum; for(k=0; k<n-1;k++){ printf("---- Step %d ----\n",k+1); printf("-- before --\n"); for( m = k;m < n;m++){ printf("%lf\n",a[n * m + k]); } printf("-- --\n"); j = pivot(a,n,k); if(j == ERROR) { return ERROR; } else { if(j != k) { for(i=0; i<n; i++){ tmp = a[n*k+i]; a[n*k+i] = a[n*j+i]; a[n*j+i] = tmp; } tmp=b[j]; b[j]=b[k]; b[k]=tmp; } } printf("-- after --\n"); for( m = k;m < n;m++){ printf("%lf \n",a[n * m + k]); } for(i=k+1; i<n; i++){ p=a[n*i+k]/a[n*k+k]; for(j=0; j<n; j++){ a[n*i+j]=a[n*i+j]-p*a[n*k+j]; printf("a[%d %d]=%lf",i,j,a[n*i+j]); } b[i]=b[i]-p*b[k]; printf("b[%d]=%lf\n",i,b[i]); } printf("k=%d\n",k); /*--------------------------------------------------------------------------*/ } /* step 2: 後退代入 */ for(k=n-1; k>=0; k--){ if(fabs(a[n*k+k]) < EPS){ return(ERROR); } sum=0.0; for(j=k+1; j<n; j++){ sum+=a[n*k+j]*x[j]; } x[k]=(b[k] - sum)/a[k*n+k]; } return 0; } int pivot(double *a, int n, int k) { int i,m; double d; /* ピボットの探索 */ m = k; d = fabs(a[k*n+k]); for(i=k+1; i<n; i++){ if(fabs(a[n*i+k]) > d){ m = i; d = fabs(a[n*i+k]); } } if(fabs(d) < EPS) { return ERROR; } else { return m; } }

  • C言語で複数列のデータを1列のみ読み込みたい

    行m列の任意のデータの処理を行うプログラムで, 列ごとの統計を行うためにm列目のデータを取り出したいのですが,うまくいきません. どのようなコードを書けばいいでしょうか? 自分で作ってみたのは以下のようなプログラムです(ファイルを開いて→m列目の読み込みの部分) EOFを使っているためか,行数のiには全データ数が入ってしまいます. void main (void) { FILE* fp; int i, j; i=0, j=0; char FilePath[500]; char Folder[100]; char File[50]; printf("Folder Name:"); scanf("%s",&Folder); printf("File Name:"); scanf("%s",&File); sprintf(FilePath,"%s/%s",Folder,File); if(( fp = fopen (FilePath,"r")) == NULL){ printf("cannot open '%s'\n", FilePath); exit(1); } //ここまではうまく動きます while (fscanf(fp, "%lf", &A[i][0]) != EOF{ i++; } while (fscanf(fp, "%lf", &A[0][j]) != EOF){ j++; } printf("A[%d][%d]", i, j); int n, m;              //n,mはこの後for文で使いたいので登場してもらいました printf("input 'n':"); scanf("%d", &n); printf("input 'm':"); scanf("%d", &m); }

  • テキストファイルの読み込みについて

    先ほどいくつかの回答をいただきありがとうございました。 またもや分からないことがあります、よろしくご回答お願いします。 test.txtと言うファイルを作り、その中は、10,20,30,40, 50,60としています。 これを以下のプログラムをVisual C++ 2005 Express Editionでコンパイルすれば読み込めるんですが、 #include <stdio.h> int main(void) { int i,j,k,l,m,n; FILE *file; file = fopen("test.txt","r"); fscanf(file,"%d,%d,%d,%d,%d,%d",&i,&j,&k,&l,&m,&n); fclose(file); printf("i = %d : j = %d : k = %d : l = %d : m = %d : n = %d\n",i,j,k,l,m,n); return 0; } このtest.txtをDドライヴの中のfileと言うフォルダに移した場合 どのようにプログラムを書き換えれば良いのでしょうか。

  • 大量のファイルを読み込み、その各ファイルの中の最大値と最小値の出力の仕方

    各ファイルの名前はinput_0.txtからinput_4.txtまであるとします。これらのファイルには(1)ナンバー(2)身長(3)体重がスペースをはさんで入力されています。 例:input_0.txt 1 172.3 65.3 2 164.3 54.6 3 176.4 55.4 4 170.2 70.4 5 167.4 63.8 この例では3番目の176.4が最大値として認識し2番目の164.3を最小値として出力させたいのですが、うまくいきません。プログラムを以下のように作りました。どこがいけないでしょうか?ご教授の方よろしくお願いします。 FILE *fpr,*fpw; int no[N],i,j,max_j,min_j; char fname[30]; float height[N],weight[N],max=0,min=0; for(i=0;i<4;i++) //file題名用ループ { sprintf(fname,"input_%d.txt",i); if((fpr=fopen(fname,"r"))==NULL) {puts("file open error!!");return 0;} for(j=0;j<5;j++){ //ファイル内容用ループ while((fscanf(fpr,"%d%f%f",&no[j],&height[j],&weight[j]))!=EOF) if(height[j]>max){ max=height[j];max_j=j; printf("number=%d__height=%.2f__weight=%.2f\n",no[max_j],max,weight[max_j]); } if(height[j]<min){ min=height[j];min_j=j;} printf("number=%d__height=%.2f__weight=%.2f\n",no[min_j],min,weight[min_j]); } fclose(fpr); }

専門家に質問してみよう