• ベストアンサー

C言語の初歩的な質問です。

C言語の初歩的な質問です。 fopenでtextファイルを複数開きたいんですけど どのようにすればよいかわかりません。 感覚的には for(i=1;i<11;i++){ FILE*fpi; fpi=fopen("i.txt","r"); while((fscanf(fpi,"%s",&score[i]))!=EOF) { }; のようにしたいんです。 もし無理ならばほかに何か方法はありませんか? わかりにくい質問ですいませんが どなたか教えてください。

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

  • ベストアンサー
回答No.6

ファイル名が00001.txtなどだとして, FILE *fpi; char buff[256]; for(i=1;i<11;i++){  sprintf(buff,"%05s.txt", i);  fpi=fopen(buff,"rt");  while((fscanf(fpi,"%s",&score[i]))!=EOF);  fclose(fpi); }; ファイルを開いたままにするなら FILE *fpi[10]; char buff[256]; for(i=0;i<10;i++){  sprintf(buff,"%05s.txt", i+1);  fpi[i]=fopen(buff,"rt"); };

その他の回答 (5)

noname#118694
noname#118694
回答No.5

同時に複数のファイルを開きたいのでしょうか? それならば開きたいファイルの数だけFILE*を用意してやればよいかと。 FILE *fp [ 10 ]; const char *filename [ ] = { "file1.txt", "file2.txt", ... }; for ( int i = 0 ; i < 11 ; i ++ ) {   fp [ i ] = fopen ( filename [ i ], "r" );   ... } 不完全ですがこんな感じでできると思います。ただし、同時に開ける数には環境ごとに制限があるので、無制限に開けるわけではありません。 同時でなくてもいいから複数開きたいならば、何回もfopenを呼び出せばそれで済みます。 FILE *fp; const char *filename [ ] = { "file1.txt", "file2.txt", ... }; for ( int i = 0 ; i < 11 ; i ++ ) {   fp = fopen ( filename [ i ], "r" );   ...   fclose ( fp ); }

  • chubou3
  • ベストアンサー率23% (264/1130)
回答No.4

多分"1.txt"、"2.txt"...と言うファイルを読み込みたいのだと思いますが。 >fpi=fopen("i.txt","r"); "i"のキャラクタコードと変数がごっちゃになってます。 答えを書くとmatsu008様の課題消化にならないのでここまでにしておきます。

回答No.3

>複数開きた 開いたものは使ったと閉じましょう。 どこで閉じているのですか? 閉じてませんよね。 開いて、使って、閉じる この繰り返しでいいでしょう。 fpiとはfp1、fp2、・・・というつもりですか? 貴方の書き方ではそのようになりません。 私が、上で言ったように閉じていれば同じ変数で処理できます。 "i.txt"も1.txt、2.txt、・・・というつもりですか? これもできません。 もし、そのようなファイル名でしたら、整数を文字列に変換してドッキングしてください。

  • t_nojiri
  • ベストアンサー率28% (595/2071)
回答No.2

まあ、少々お小言を言うと1つのプログラムが同時に3つ以上のファイルを開く事は、あんまりソフトウェアの設計上良く有りません。 多分マージの処理をしても2つのファイルを読み込んでマージしたら、その読んだファイルは閉じるでしょう? とりあえず、work用に1つreadwrite設定でファイルを開けて、readしたファイルをそのまま追加して行って、最後に先頭にseekして先頭に戻ってから処理したって、ファイルポインタは2つでどうにかなりますけどね。

  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.1

確認してないですけどそれで開けませんでした?

関連するQ&A

  • C言語 テキストの場合分け

    C言語プログラミングの質問です。 x1, y1, r1, distance1 x2, y2, r2, distance2 ・・・ と続くテキストを読み込み、distanceを10刻みで場合分けをするプログラムを作成しています。初心者で苦戦しているところですが、以下のサンプルの間違いをご指摘いただけませんでしょうか。 よろしくお願いいたします。 テキストの行数とdistanceの最大値は不明です。 ーーーーーーーー #include <stdio.h> #include <stdlib.h> #include <math.h> #include <string.h> #include <locale.h> int main(int argc, char *argv[]) { int a,b,c,distance; int i=0; int num[200]; FILE* inifile = fopen("file.txt", "r"); if(inifile==NULL) { printf("err__file.txt is nothing!!"); return 0; } FILE* outfile = fopen("outfile.txt", "w"); if(outfile==NULL) { printf("err__outfile.txt is nothing!!"); return 0; } while (fscanf(inifile,"%d\t %d\t %d\t %d\n", &a, &b, &c, &distance) != EOF) fclose(inifile); for(int i =1; i<101; i++) { if((i-1)*10 <= distance && distance < i*10) { num[i]+=1; } } for(int i =1; i<101; i++) { fprintf(outfile, "%d\t", num[i]); } fclose(inifile); fclose(outfile); printf("Normal END\n"); return 0; }

  • C言語のプログラムに関する質問です。

    C言語初心者で困っています。 SNをサンプリング数、FNをファイル数として、テキストファイルの1行目のデータ(kari[0])と2行目のデータ(kari[1])をそれぞれCH1、CH2に読み込むような以下のようなプログラムがあります。 ------------------------------------------ //読込みファイル名の設定// for(j=1;j<FN+1;j++){ sprintf(file_name,"%s%d%s",file,j,".txt"); printf("%d%s\n",j,file_name); if ((fp = fopen(file_name, "r")) == NULL){ printf("Error: Can't open file; %s\n", file_name); } //データの読込み// for(i=0;i<SN;i++){ fscanf(fp,"%lf,%lf\n",&kari[0],&kari[1]); ch1[i]=kari[0]; ch2[i]=kari[1]; } fclose(fp);       ・       ・       ・ fclose(fp); } ---------------------------------------------- しかし、テキストファイルの初めの3行には不必要な文字列が存在するため、4行目から読み込むように設定したいのですが、やり方がよく分かりません。 どのようにプログラムを書き換えれば良いか、教えていただけると助かります。 よろしくお願いします。

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

  • fscanfの使い方。

    while(fscanf(fpi,"%[^ ]",s[i]) != EOF){//スペース毎にファイルを配列に読み込む。 while文内に入り込めないんで多分間違ってます。 sはchar型で宣言しています。 fpiは読み込み形式です。 何が間違っているかわかりません。 よろしくおねがいします。

  • 加算できない

    #define NUM 1 void main(int argc, char *argv[]) { int i; float su01[NUM],suetc[NUM],j; FILE *fpi,*fpl; fpi = fopen(argv[1],"r"); fpl = fopen(argv[2],"r"); for(i=0;i<NUM;i++){ fscanf(fpi,"%f",&su01[i]); } for(i=0;i<NUM;i++){ fscanf(fpo,"%f",&suetc[i]); } for(i=0;i<NUM;i++){ suetc[i] += su01[i]; } for(i=0;i<NUM;i++) printf("%f\n",suetc[i]); } このプログラムで「aaa.txt」に入った30と「bbb.txt」に入った20を足して、50が入った「ccc.txt」というファイルを作りたいのですが、足し算をすることが出来ません。 よろしければご指摘をお願いします。

  • C言語初心者の質問 fscanf

    C言語を勉強し始めた初心者です。 後述するプログラムにおいて、カレントディレクトリ上にあるフォルダー(data)内のファイル名をfscanfで読み込んで、標準出力で表示するプログラムを作っています。 コンパイルはうまくいくのですが、プログラムを実行しようとするとプログラムが停止してうまくいきません。 不具合点と改善点をおしえてください。 実行環境?はwindows7,visual studio 2013 です。 #include<stdio.h> int main(void) { int i=0; char s[100][100]; FILE *fp; fp=fopen(".\\data","r"); while((fscanf(fp,"%s",&s[i][100]))!=EOF){ printf("%d:%s\n",i,s[i][100]); i++; } return 0; }

  • c言語 

    データを構造体の配列に格納したいのですが、このやり方ではできませんでした。どうすればいいですか? (ファイル内のデータを読み込んで格納しようとしています。) typedef struct dataset{ int price; char id; char name; }data; int main(void) { FILE *f = fopen("input.txt","r"); FILE *output = fopen("output.txt","w"); char order[100]; char name[100]; char id[100]; int price; int num = 0; while(fscanf(f,"%s",order) != EOF){ fscanf(f,"%s%s%d",product->name[num],product->id,&product[num].price); num++; } } return 0; } input.txt CD Kenji 300 DVD Nanako 350 PC Koki 1000 ........

  • C言語の課題なのですが、助けてください

    C言語のプログラミングの課題で、「以下のプログラムをキーワードを引数として入力できるように変更する(argvを利用する)」という問題なのですが、プログラミングが苦手な私にはさっぱりわからず、大変困っています。設問のプログラミングがわかる方がいらっしゃいましたら、教えていただけると大変助かります。よろしくお願いします。 #include <stdio.h> #include <string.h> #include <stdlib.h> #define MAX_LEN 256 int main(int argc, char *argv[]) { FILE *rfp; FILE *wfp; int i, score; double evalue; char id[MAX_LEN], name[MAX_LEN], fname[MAX_LEN]; char keyword[] = "glu"; for(i = 0; i < 100; i++){ sprintf(fname,"files/%d.txt",i); if((rfp = fopen(fname, "r")) == NULL) { printf("入力ファイルが存在しません。\n"); return (EXIT_FAILURE); } while (fscanf(rfp,"%s\t%s\t%d\t%f", id, name, &score, &evalue) != EOF){ if (strstr(name,keyword) != NULL){ printf("%s\n",id); } } fclose(rfp); } return (EXIT_SUCCESS); }

  • C言語の問題です。

    優勝者のデータを出力する以下のプログラムの空欄((1)~(3))を埋めて完成させてください。 #include<stdio.h> #define N 20 struct SANKA{ int zk; char name[30]; double time; }; void Yusyou⁽int n,struct SANKA ns[], struct SANKA *m){ struct SANKA wmin; int i; wmin = (1) for(i=1;i<n;i++){ if(wmin.time>ns[i].time) wmin=(2); } *m = wmin; } main(){ FILE *fp; struct SANKA score[N],max; int n=0; int i=0; fp=fopen("data100.txt","r"); while(fscanf(fp,"%d %s %lf,&score[n].zk,score[n].name,&score[n].time != EOF) n++ fclose(fp); Yusyou(n,score,(3)); printf("優勝者:ゼッケン番号 %3d番 %10s タイム%10.3f秒\n",max.zk,max.name,max.time); } data100.txtには 1 朝倉 20.5 2 池川 17.3 3.上原 19.2 4 榎本 17.1 5 岡田 16.2 6 河野 16.5 7 菊池 19.7 8 近藤 15.5 9 清水 18.8 10瀬田 16.8 全く見当がつきません。回答をお願いします。

  • C言語の質問です。クイズをテキストファイルに書き、それを読み込むという

    C言語の質問です。クイズをテキストファイルに書き、それを読み込むというモノなのですが、その前に前回のスコアを読み込み、棒グラフにして出力しなければいけません。また、問題も1行ずつ読み込み正否を判定します。問題のテキストは、「1,問題文 1.○○ 2,○○ 3.○○」とし、頭に解答を書いています。最後に、正解した数をスコアファイルに書き、終了とします。一応、初めてなら、スコアファイルを新規作成し、2回目ならスコアファイルを開く、というところまでは、出来ましたが、その後がどうにも進みません・・。どなたか教えて頂けないでしょうか・・。 #include <stdio.h> int main(void) { FILE *fp; char str[256]; if((fp = fopen("score.txt","r")) == NULL){  printf("このゲームを初めて実行しますね。\nスコアファイルを新規作成します。\n");  fp = fopen("score.txt","w");  fclose(fp);} else{  printf("スコアファイルを読み込みます。\n");  fp = fopen("score.txt","r");  fclose(fp);} return 0; } 一応ここまでは、出来ています。

専門家に質問してみよう