• ベストアンサー

複数ファイルの同時読み込みの方法と脱初心者向け参考書

ループにて、複数のファイル(.txt)を同時に読み込む方法はあるのでしょうか。(厳密に言えば、完全に同時ということではなく、時間差をつけてということ)。以下のプログラムではループ自体が行われていないようでした。while分とfreadの使い方に問題があると思うのですが… ~略~ int a,b; FILE *fp1,*fp2; fp1 = fopen(…,"r"); if(fp1 == NULL) {・・・;} fp2 = fopen(…,"r"); if(fp2 == NULL) {・・・;} while((a = fread(…,1,8,fp1)) != 0) { while(fread(…,1,8,fp2)) { ~略~ } } fclose(fp1); fclose(fp2); 以下略~ また、2つ目のwhileを削除し次のようにすると1つ目のファイル(fp1)は読み込めるのですが、2つ目のファイル(fp2)が読み込めていないようでした。 ~略~ while((a = fread(…,1,8,fp1)) != 0) { b = fread(…,1,8,fp2); 以下略~ 解決方法を教えていただけないでしょうか。 次にいわゆる脱初心者向け(?)ともいえる参考書について。 初心者向けの入門書に載っている関数についての説明などは、どれも最も基本的な機能についてのものがほとんどで、少し応用したものは載ってません。 また、多少上級向けになると、例えば「int sprintf(char *buf,const char *format,…)」や、「int printf(const char *format,…)」といった具合にいかにも専門書らしくなっています。また使用例も、他に見たこともない関数が同時に出てきてまるで手がつけられません。 それはそれで重要なことであるのはわかるのですが、「sprintf(s,"%d%d",a,b) s文字配列、a,b整数値」という理解しやすい書き方をあわせて載せてある、「関数辞典」みたいな参考書とかは市販されているのでしょうか。私の理想通りの物とまでは言いませんが、お薦めのものを推薦していただければ幸いです。 よろしくお願いします。

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

  • ベストアンサー
  • neKo_deux
  • ベストアンサー率44% (5541/12319)
回答No.1

関数の使い方の問題でなく、考え方の問題かも。 > FILE *fp1,*fp2; ファイルは「本」、ファイルポインタは「しおり」と例えます。 複数(仮に5冊)の本を読むのに、ファイルポインタを2つ宣言しています。 2枚のしおりをどう使えば、5冊の本の全てのページを網羅する事ができるでしょうか? って事を考えると、しおりが2枚なのは誤りで、5枚のしおりを使うか、1枚のしおりを使いまわすかの方が良いと思いませんか? -- または、5冊の本の題名を書いた別の5ページ本が1冊あるのなら、何枚のしおりをどう使えば良いか?って事とか。

AVATAR
質問者

お礼

ご回答ありがとうございました。

その他の回答 (3)

回答No.4

再びNo.2です。 私は「なにをしたい」のか書いてはどうかとアドバイスしているのですが、 回答者の書いていることをきちんと読んでいますか? 前回の質問でも回答者に対していい加減としか思えないお礼で済ませているし、 今回もまた同じ調子ですね。 >一つのファイルを幾つかの関数で試したことはあるにはあるのですが これは誰に対する言い訳ですか? 私には言い訳なんて必要ありません。 テキストファイルを扱うと言いつつfread()を使う辺り、 まともに動くものが書けているとは思えませんから。 #fread()では不可能と言うことでなく、そういう方針では無理だと言うことです。 プログラミングに王道はありません。 一歩ずつ地道にやるか、誰かに丸投げするか、どちらかを選択するしかないと思いますが如何?

AVATAR
質問者

お礼

プログラムの目的は、二つのファイルの中身を文字列として読み込み、特定の文字の数を数えたりしてみようとしたものです。 思うように動作しなかったのは、勘違いでの記述ミスでした。修正後、結果としては目的どおりになりました。 大変お手数をお掛けして申し訳ありませんでした。

回答No.3

少なくとも、fread の第一引数が、... では、どこがどう間違っているのか判断のしようがありません。 また、「ループ自体が行われていないようです」や、「2つめのφ卯が読み込めてないようでした」というのは、どのように確認されたのでしょう。 確認方法自体が間違いだったり、勘違いだったという可能性も高いのですが。

AVATAR
質問者

お礼

ご回答ありがとうございます。 質問は勘違いから投稿してました。記述ミスでうまくいかなかったみたいです。少なくとも結果的には目的どおりになりました。お手数をお掛けしました。申し訳ありませんでした。

回答No.2

何度も同じようなレベルの質問を繰り返すより、 いっそ「なにをしたい」か書いてしまったほうが宜しいのでは? そもそも一つのファイルを読み込んで何か処理するプログラムを書いたことはありますか? それさえできないのに複数のファイルをいきなり扱うのはかなり無謀だと思いますが。 #例えば、教習所も出ていないのにレースに出るようなものでしょうかねぇ。

AVATAR
質問者

お礼

ご回答ありがとうございます。 >そもそも一つのファイルを・・・ 全てではありませんが、一つのファイルを幾つかの関数で試したことはあるにはあるのですが…

関連するQ&A

  • Cプログラム ファイルの書き込み→読み込み

    #include<stdio.h> void p07a(char *name); void p07b(char *name); //メイン関数 int main() { char name[100]; printf("File Name?"); scanf("%s",name); //ファイルへの書き込み p07a(name); //ファイルからの書き込み p07b(name); puts("!!!!!END!!!!!"); return(0); } //ユーザー関数 void p07a(char *name) { while(1) { int a,b; FILE *fp; fp=fopen("name","w"); scanf("%d,%d",&a,&b); fclose(fp); } } void p07b(char *name) { int i,a[i],b[i],sum,sumb,aave,bave; FILE *fp2; i=0; sum=0; sumb=0; while((fscanf(fp2,"%d,%d",&a[i],&b[i]))!=EOF){ sum+=a[i]; sumb+=b[i]; i++; } aave=sum/i; bave=sumb/i; fclose(fp2); } のプログラムなのですが、書き込むファイル名を入力しても次の処理へ進みません ユーザー関数がおかしいのでしょうか?

  • 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 : :

  • 大量のファイルの読み込みについて

    -512.txt~512.txtのファイルを順に読み込むプログラムを 作っています。 以下のコードのように作って動かしてみたのですが, -512から-3.txtまで入力してくれるのですが -2.txtの所でエラーが起きてしまいます. ファイルは確実に存在するのですが… fopenには大量のファイルを読み込むのは向いてないのでしょうか? 他に良い方法があれば教えて頂けると幸いです. 宜しくお願いします #include <stdio.h> #include <stdlib.h> int main(void) { FILE *fp; int i=0; char s[256]; char filename[256]; //ファイル名編集 for(i=-512;i<512;i++){ fp=NULL; sprintf(filename,"distance\\routing_a\\%d.txt",i); printf("%sを読み込みます\n",filename); /* ここで、ファイルポインタを取得する */ if ((fp = fopen(filename, "r")) == NULL) { printf("%s file open error!!\n",filename); exit(EXIT_FAILURE); /* (3)エラーの場合は通常、異常終了する */ } } fclose(fp); /* (5)ファイルのクローズ */ return 0; } 環境 OS:windows XP 開発環境 visual studio 2008

  • C言語でファイルから読み込みができません。

    以下のプログラムを実行すると よくわからない値が返ってきます。 なぜでしょうか?教えてください。 #include <stdio.h> void main () { FILE *fp; double a, b; int count=0; fp = fopen("test.xls", "r"); while(1) { fscanf(fp, "%lf %lf\n", &a, &b); printf("%f, %f\n", a, b); count++; if(count==10)break; } fclose(fp); } test.xlsの中身は 1.0 2.0 3.0 4.0 5.0 6.0   :   :   :   : です。 よろしくお願いします。

  • 複数のファイルへの一括処理(困ってます)

    あるディレクトリ内の全てのファイルに同じ処理(添付のプログラムによるtest1.csvファイルに対する処理と同一の処理)をしたいと考えています。 どのようなプログラムを組めば良いのですか? 手法については検討もつかない状況です。 教えていただけないでしょうか? よろしくお願いいたします。 (1)添付のプログラム #include <stdio.h> #include <conio.h> #include <string.h> #include <stdlib.h> int main () { FILE *fp; char a[50]; double b; char *p; if((fp = fopen("test1.csv", "r")) == NULL) return 0; while(fscanf(fp, "%s\n", &a) != EOF){ p = strtok( a, "," ); b = atof(a); printf("%lf ", b); while(p != NULL) { p=strtok(NULL, ","); if(p != NULL) { b = atof(p); printf("%lf\n", b); } getch(); } } fclose(fp); return 0; } (2)プログラムで使うCSVファイル -749.95,1.499894061 -749.9,2.371277071 -749.85,3.01070131 -749.8,-0.92298313 -749.75,3.111961134 -749.7,-1.642278763 -749.65,2.759562723 -749.6,0.869387239 -749.55,1.400240703 -749.5,-0.574988131 -749.45,-2.282041367 -749.4,-1.104953718 -749.35,2.45568825 -749.3,-1.391859875 -749.25,-1.600438736 -749.2,0.116074589 -749.15,2.973864166 -749.1,2.652719198 -749.05,1.584699094 -749,2.129474673 -748.95,1.847275561 -748.9,2.974398019 -748.85,1.561458246 -748.8,2.897905731 -748.75,2.655075544 -748.7,-2.677451989 -748.65,-0.871814301 -748.6,-3.098832888 -748.55,2.565297638 -748.5,-2.073626148 -748.45,-0.300440285 -748.4,0.515248274 -748.35,2.983715685 -748.3,-2.47909508

  • fscanf()

    fcanf()がうまくいきません。 画面には、42640888のような数値が表示されます。 どこが間違ってるか教えてください。 (test.txtに23と書いてあるとします。) #include<stdio.h> int main(void) {    FILE *fp;    FILE *fp1;    char str[10];    int a;    fp=fopen("test.txt","r")    fp1=fopen("a.txt","w")    while(!feof(fp)){       fgets(str,8,fp);       fputs(str,fp1);    }    fscanf(fp,"%d",&a);    printf("%d",a);   fclose(fp);   fclose(fp1);   return 0; }

  • C言語、fgetcを利用しファイルの内容を変数に

    C言語について質問です C言語のfgetcを利用しファイルの内容を変数にいれてそれを返す関数を作っているのですがうまくいきません <!--以下ソース--> char *file_get_contents(char *filename){ FILE *fp; int c; char *return_str; if((fp=fopen(filename,"r"))==NULL) return NULL; while((c=fgetc(fp))!=EOF ){ sprintf(return_str,"%c",c); } fclose(fp); return return_str; } 誰か理由と改善方法を教えてください!

  • C言語でコマンドmvを実行

    name.txtというテキストファイルがあり、中身は 123 abc 456 def … となっています。 このテキストファイルを1行ずつ読み込んで、 mv 123/ abc/ のようにテキストファイルの中身に沿って、ディレクトリの名前を一気に変更したいのですが、上手くいきません。 どこがおかしいか、教えていただけないでしょうか。 /* header files */ #include <stdio.h> #include <stdlib.h> /* main */ int main(int argc, char *argv[]) { char *buff; float ret, ter; char a[50],b[50]; FILE *fp, *fq; fp = fopen(argv[1], "r"); while((ret = fscanf(fp,"%s %s",a,b)) != EOF){ sprintf(buff, "mv %s %s",a,b); system(buff); } fclose(fp); return EXIT_SUCCESS; }

  • 複数のC言語プログラムが,一つのファイルに書き込み

    2つのプログラムで一つのテキストファイルに書き込むと,エラーが起きてプログラムが停止するんじゃないかなーと思っていましたが,起きませんでした. 検証結果がまた謎であり,知識も足りず,解釈ができないので,力を貸してください. 動作環境は先に言いますと,win7のVC++2010コンパイラです. ---プログラムA FILE *fp = fopen("test.txt", "w"); while(true){ fputc('@', fp); } fclose(fp); ---end ---プログラムB FILE *fp = fopen("test.txt", "w"); while(true){ fputc('_', fp); } fclose(fp); ---end (1)Aを走らせる・・・ファイルには@がたくさん出力されていると思われる. (2)Bを走らせる・・・Aがファイルを操作しているんだから,fopen関数でエラーが出ると思ったが,出なかった.稼働してしまったので,fopenの書き込みモードによってファイルは真っ新になり,「_」が先頭から羅列され始めただろう. (3)Bを停止する・・・「_」の出力は止まっただろうが,プログラムAの方は今何をしているんだろう.元気かな (4)Aを停止する 出力結果すなわちtest.txtの内容は次のようだった. ___________・・・______[NULL][NULL][NULL]・・・[NULL][NULL]@@@@@@@・・・@@@@@@@ これについて質問があります. Q.NULLが出力されているのはどうしてか. Q.AはBが書き込んでいる間,待っていたようだ(Bを停止した後で待ってましたと言わんばかりに@が書き込まれた形跡があるから)が,これは仕様なのか.エラーが出るということを気にする必要はないのか. 余談,予備知識大歓迎です.よろしくお願い致します.

  • fread関数でわかりません。

    fread関数で次のようにソースを記述しました。 FILE *fp; char c[10]; int i; fp = fopen ("./aaa.txt", "rb"); fread(c, sizeof(char)-1, 10, fp); for(i = 0; i < 10; i++) printf("%02x ", *(c+i)); fclose(fp); return 0; aaa.txtの中には 0x1~0xAの10個の数字が記入されています。 cをint 型にすると正常に読み込めるのですが、char型だと 01 00 00 00 02 00 00 00 03 00 となってしまい、正常に読み込めません。 どうも、int型で読み込み、さらに引数 cにはchar *でキャストして渡しているように見受けられます。 Q1 どのようにしたら、char型で 10個一度に読み込めるようになるのでしょうか? Q2 int型(32bit)なら、一度に4文字読み込むと思いますが、何故一文字ずつ読み込むことになるのでしょうか? //getc で一文字ずつ読み込めば済む話ですが、気になり質問いたしました。