ファイルが読み込めない

このQ&Aのポイント
  • testのなかみをtest, 22.2, 33.3として、Visual C++ 2005でこれをコンパイルすると、わけのわからない数字がでてきます。
  • 初心者なのでどこが間違ってるのかわかりません。
  • #Cプログラミング #ファイル読み込み #コンパイルエラー #初心者
回答を見る
  • ベストアンサー

ファイルが読み込めない

testのなかみを test,  22.2,  33.3,  として、 Visual C++ 2005でこれをコンパイルすると、わけのわからない数字がでてきます。 初心者なのでどこが間違ってるのかわかりません。 よろしくお願いします。 #include <stdio.h> int main(void) { char str[20]; double i,j; FILE *file; file = fopen("d:\\test\\test","r"); fscanf(file,"%s, %lf, %lf,",str,&i,&j); fclose(file); printf("i = %f : j = %f\n",i,j); return 0; }

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

  • ベストアンサー
  • buriburi3
  • ベストアンサー率44% (353/792)
回答No.1

scanfの%s指定は区切り記号としてカンマを認めていないからです。 ※testの中の全角スペースは転記する際の間違いと判断しました。 方法としては次の3つの方法があるかと思います。 1) fgetsで1行文字列として取り込んで文字列分解は自前で行う。 2) testの区切り記号をスペースかタブに変更する。 3) 書式指定を "%[^,],%lf,%lf" にする。  ※コンパイラによっては動かない。VC++2005では動く。

nichirei
質問者

お礼

ありがとうございました。 お蔭様で動きました。 3) 書式指定を "%[^,],%lf,%lf" にする。 の方法でクリアしました、Sのかわりの[^,]はどう言うことですか。 素人にはさっぱりわかりません。 どこで調べればいいのか? 大変助かりました。

その他の回答 (1)

  • buriburi3
  • ベストアンサー率44% (353/792)
回答No.2

scanf/sscanf/fscanfは書式指定に正規表現が使えます。 「scanf 正規表現」あるいは「scanf デリミタ」等で検索すれば何か解説しているページが見つかります。 scanfを使うことはまず無いので詳細は覚えてませんが完全な正規表現ではなく<なんちゃって正規表現>だったような気がします。 ※文字列をカンマ区切りに分解する関数を作り置きしてありscanfを使う必要が無いので。

nichirei
質問者

お礼

重ねてありがとうございます、また必ずわからないことがあると思います、その時はまたよろしくお願いします。

関連するQ&A

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

    また教えてください test13.txtの中身を1,2,3,4,5,6として、以下をコンパイルスルと、 printf("%d\n",a[0]);のときは 1 と結果がでますが printf("%d\n",a[3]);とすると -858993460などと、わからない数字がでます、どこがおかしのか初心者なのでさっぱりわかりません。 #include <stdio.h> int main(void) { int i; int a[6]; FILE *file; file = fopen("d:\\test\\test13.txt","r"); for(i=0;i<6;i++) fscanf(file,"%d",&a[i]); fclose(file); printf("%d\n",a[3]); return 0; }

  • 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言語でファイルから読み込みができません。

    以下のプログラムを実行すると よくわからない値が返ってきます。 なぜでしょうか?教えてください。 #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   :   :   :   : です。 よろしくお願いします。

  • Cでのファイルからの入力およびファイルへの出力

    こんばんわ。質問があります。Cでのファイルの入出力についてなんですが、「fscanf」と「fprintf」を用いてあるデータファイルからデータを取り込んで処理をしてファイルに書き出すプログラムを作成したのですが、私が作成したプログラムの場合、まずfscanfでファイルをすべて読み込んでしまって、それから処理をして書き出すというプログラムなのですが、この方法ではなく、はじめに最初の1行だけを読みこんでその1行だけを処理して書き出し、次に2行目だけを読み込んで処理して書き出し、そして3行目を読み込んで処理・・・・という風に1行ごとに読み込みおよび書き込みを行っていくプログラムを作成したいのですがどのようにプログラムを組んでよいのか分かりません。アドバイスがいただけると幸いです。よろしくお願いいたします。 ちなみに私が作成したプログラムは下記のようなものです。 #include <stdio.h> #define NDATA 10000 #define NMAX 40 main() { double x[NDATA], y[NDATA], z[NDATA]; double xx[NDATA], yy[NDATA], zz[NDATA]; int i, n=0 FILE *in_file, *out_file; char in_filename[NMAX], out_filename[NMAX]; printf("Input filename: "); scanf("%s", in_filename); in_file = fopen(in_filename, "r"); while(fscanf(in_file, "%lf %lf %lf", &(x[n]), &(y[n]), &(z[n])) != EOF) n++; fclose(in_file); for(i=0; i<n; i++) xx[i] = x[i]*y[i]; yy[i] = y[i]*z[i]; zz[i] = z[i]*x[i]; printf("Output filename: "); scanf("%s", out_filename); out_file = fopen(out_filename, "w"); for(i=0; i<n; i++) fprintf(out_file, "%f %f %f\n", xx[i], yy[i], zz[i]); fclose(out_file); }

  • datファイルの読み込み

    初歩的な質問ですみません。 今、819200行のファイルをfscanfで読み込んで配列に格納しているのですが、実行してみるとBus errorが出力されてしまい、うまく格納できません。どなたか至急教えてもらえませんか? ***************************ソース************************************************************ #include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> #define pi 3.1415926535 //円周率 #define FILE_SIZE 819200 #define FILE_NAME "test.dat" struct Data{ int time; double voltage; double velocity; double pressure; double trigger; }; int main() { int k,n,N,i=0,j; struct Data dat[FILE_SIZE]; FILE *fp1; FILE *fp2; if ((fp1 = fopen(FILE_NAME,"r")) == NULL) { printf( "file open error\n" ); exit(EXIT_FAILURE); } //データの読み込み while((fscanf(fp1, "%d %lf %lf %lf %lf",dat[i].time,dat[i].voltage,dat[i].velocity,dat[i].pressure,dat[i].trigger)) !=EOF ){ i++; } fclose(fp1); return 0; } ***************************************************************************************** ********************test.datファイル********************************************** -2.64316 2.329595 0.697657 0.001373 -4.861982 -2.64314 2.325628 0.671961 0.001984 -4.744793 -2.64312 2.320745 0.640333 0.001678 -4.659953 -2.64310 2.319829 0.634400 0.002289 -4.707866 -2.64308 2.319219 0.630449 0.002289 -4.699321 -2.64306 2.317082 0.616607 0.002594 -4.532387 . . . . . *********************************************************************************** 環境はmac osです。 よろしくおねがい致します。

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

    先ほどいくつかの回答をいただきありがとうございました。 またもや分からないことがあります、よろしくご回答お願いします。 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と言うフォルダに移した場合 どのようにプログラムを書き換えれば良いのでしょうか。

  • csvファイルの読み込み

    fscanf関数を用いて、csvファイルの内容を構造体のそれぞれのメンバに読み込んで表示させようとしているのですが、4列目以降が上手く読み込めません。初歩的な質問で申し訳ありませんがどなたか教えてください。 ****************************ソース************************************************ #include <stdio.h> #include <string.h> #include <stdlib.h> #define SIZE 64 #define FILE_NAME "view_001_McdlData.csv" #define FILE_SIZE 819200 struct Data{ int DataNo; int FrameNo; int SampleNo; char Digital; double voltage; double trigger; double C; double D; }; int main(int argc, char *argv[]) { FILE* fp,*fo, *fi; // ファイルポインタ用 int n, i, file_size; double time,vel[FILE_SIZE]; struct Data *dat; char buff[SIZE]; if ((fp = fopen(FILE_NAME,"r")) == NULL) { printf( "file open error\n" ); exit(EXIT_FAILURE); } fseek(fp, 0, SEEK_END); file_size = ftell(fp); dat = (struct Data*)malloc(file_size); printf("malloc address= %p, file size= %d\n", dat, file_size); fseek(fp, 0, SEEK_SET); i = 0; //データの読み込み while((fscanf(fp, "%d,%d,%d,%s,%lf,%lf,%lf,%lf",&dat[i].DataNo,&dat[i].FrameNo,&dat[i].SampleNo,&dat[i].Digital,&dat[i].voltage,&dat[i].trigger,&dat[i].C,&dat[i].D)) !=EOF ){ printf("%d %d %d %s %lf %lf %lf %lf\n",dat[i].DataNo,dat[i].FrameNo,dat[i].SampleNo,dat[i].Digital,dat[i].voltage,dat[i].trigger,dat[i].C,dat[i].D); i++; } fclose(fp); return 0; } ***********************************csvファイルの内容************************************ 0,1,0,0x3F,2.270000,0.000000,-1.000000,-1.000000 1,1,1,0x3F,2.260000,0.010000,-1.000000,-1.000000 2,1,2,0x3F,2.260000,0.010000,-1.000000,-1.000000 3,1,3,0x3F,2.260000,0.010000,-1.000000,-1.000000 4,1,4,0x3F,2.260000,0.010000,-1.000000,-1.000000 5,1,5,0x3F,2.260000,0.000000,-1.000000,-1.000000 ***************************************************************************************************

  • C言語のファイル読み込み

    あるcsvファイルがあり、それは以下のように(規則性のない)波形のデータです。 0.001 0.14 0.002 0.32 0.003 0.46 ・ ・ 2.000 0.22 左側がx軸、右側がy軸で、データはそれぞれ2000個あります。 このデータ(波形)をC言語のプログラムに読み込ませるにはどうしたらいいのでしょうか? #include <stdio.h> int main(void) { double i,j; FILE *file; file = fopen("sample.csv","r"); fscanf(file,"%ls,%ls",&i,&j); fclose(file); printf("i = %d : j = %d\n",i,j); return 0; } とすれば最初の1行目だけは読めますが、それ以降がわかりません。 配列を使えばいいのでしょうか?

  • テキストファイルについて

    以前は、マップを作るときに下のようにしていたのですが char dungeon[5][5]={{0,0,0,1,1}, {1,1,0,1,1}, {1,0,0,0,1}, {1,1,0,1,1}, {1,1,0,0,0}}; for(i=0;i<5;i++){ for(j=0;j<5;j++){ else if(dungeon[i][j]==0)printf("+"); else printf("#"); } printf("\n"); } 最近、ファイルの入出力で読み込む事にチャレンジしています。 それで、メモ帳で書いたマップを使おうとしているのですが、 こんなのです。 1011111111111 1000000000001 1111111111101 1111100000001 1111100000001 1111100000001 1111100002001 1000000000001 1011111111111 fp = fopen("map.txt","r");の部分でテキストファイルを指定しますが、複数作った上のようなマップを切り替える時、どうすればいいんでしょうか? 質問が稚拙かもしれませんがよろしくお願いします。 #include <stdio.h> void map(void);//マップの表示関数の宣言 int main(){ map(); } void map(void));//マップの表示関数の定義 { FILE *fp; char str[1024];//これくらいでいいかな? //map.txtを読み込みモードで開く fp = fopen("map.txt","r"); //ファイルオープンに失敗したら if(fp==NULL){ //失敗を表示し終了 printf("ファイルのオープン失敗\n"); return -1; //exit;でもいいのかな? } //fgetsの戻り値がnullになるまで //strにファイルから内容を格納 while((fgets(str,256,fp))!=NULL){ //格納された文字を出力 printf("%s",str); } //ファイルを閉じる fclose(fp); }

  • ファイル

    AからZまでの文字が何回出力されるか数えるプログラムなのですが、うまく出力されません。 どこを変えればよろしいでしょうか。 #include<stdio.h> #include<stdlib.h> #include<ctype.h> int count[26]; int main(void) { char str[100] = "xyzYZZ\n"; FILE *fp; char *p; int i; char ch; if((fp = fopen("myfile","w")) == NULL){ printf("ファイルを開くことが出来ません"); exit(1); } p = str; while(*p){ if(fputc (*p,fp) == EOF){ printf("ファイル書き込みエラー"); exit(1); } p++; } fclose(fp); if((fp = fopen ("myfile","r")) == NULL){ printf("ファイルを開くことが出来ません"); exit(1); } while((ch == fgetc(fp)) != EOF){ ch = toupper(ch); if( ch >= 'A' && ch <='Z' ) count[ch - 'A']++ ; } for( i=0 ; i<26 ; i++) printf("%c は %d 回出現\n",i + 'A', count[i]); fclose(fp); return 0; }

専門家に質問してみよう