C言語 ファイル読み込み結果の表示

このQ&Aのポイント
  • C言語でファイルを読み込んで、結果を表示する方法について教えてください。
  • ファイルの内容を読み込んで、指定した形式で表示する方法を知りたいです。
  • 「aaa.csv」というファイルを読み込んで、結果が意図しない形式で表示されます。どのように修正すれば正しく表示されるでしょうか。
回答を見る
  • ベストアンサー

C言語 ファイル読み込み結果の表示

読み込むファイル: aaa.csv A,B,C,1.2,1.2 D,E,F,1.4,1.2 実行結果: A B C 1.2 1.2 D E F 1.4 1.2 E F 1.4 1.2 下記のコードを実行した時、実行結果が上記のような三行となります。 3行目の"E F 1.4 1.2"がなぜ表示されてしまうのかわかりません。 御教示いただければ幸いです。 [code] #include <stdio.h> int main(void) { FILE *fp; char data1[20][100]; int line; fp = fopen("aaa.csv", "r" ); if( fp == NULL ){ return -1; } while(1){ if(line = fscanf(fp, "%[^,],%[^,],%[^,],%[^,],%s", data1[0],data1[1],data1[2],data1[3],data1[4])==EOF){ return -1; }else{ printf("%s %s %s %s %s", data1[0], data1[1], data1[2], data1[3], data1[4]); } } fclose( fp ); return 0; } [\code]

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

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

改行コード('\n')の扱いが悪さをしていたようです。 #include <stdio.h> int main(void) { FILE *fp; char data1[20][100]; fp = fopen("aaa.csv", "r"); if (fp == NULL) { fprintf(stderr, "file open error\n"); return -1; } while (1) { if(fscanf(fp, "%[^,],%[^,],%[^,],%[^,],%s\n", data1[0], data1[1], data1[2], data1[3], data1[4]) == EOF) { return -1; } else { printf("%s %s %s %s %s\n", data1[0], data1[1], data1[2], data1[3], data1[4]); } } fclose(fp); return 0; } で直るかと。 なお、ここの掲示板では[code]タグは無効です。

tokagenosuke
質問者

お礼

解決いたしました。 ありがとうございました。

その他の回答 (1)

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

もし、EOFの判定の際に変数lineをどうしても使いたければ、 if文におけるカッコを適切に補って下記のとおりにする必要があります。 #include <stdio.h> int main(void) { FILE *fp; char data1[20][100]; int line; fp = fopen("aaa.csv", "r"); if (fp == NULL) { fprintf(stderr, "file open error\n"); return -1; } while (1) { if ((line = fscanf(fp, "%[^,],%[^,],%[^,],%[^,],%s\n", data1[0], data1[1], data1[2], data1[3], data1[4])) == EOF) { return -1; } else { printf("%s %s %s %s %s\n", data1[0], data1[1], data1[2], data1[3], data1[4]); } } fclose(fp); return 0; }

tokagenosuke
質問者

お礼

解決いたしました。 ありがとうございました。

関連するQ&A

  • C言語でCSVデータを読み込んで加工して保存したい

    C言語でCSVデータを読み込んで加工して保存したい。 CSVデータの中身は 1 -0.001 2 -0.11 3 -0.22 4 -0.625 5 -0.55 という式を、 一行目+0行目=答え(1) 答え(1)+2行目=答え(2) 答え(2)+3行目=答え(3)という処理を行い、 1 答え(1) 2 答え(2) 3 答え(3) 4 答え(4) 5 答え(5) とCSVファイルに加工して保存するプログラムを作りたいのですが、どのようなプログラムを追加すれば良いのか分かりません。恐らくCSV内部データを配列データに保存して、配列データをfor分にて計算していけばよいのでしょうが、分かりません。 プログラム例を記載していただけないでしょうか。 以下CSVファイルを読み込んで表示するプログラムを示します。下記プログラムに加筆をお願いいたします。 #include <stdio.h> int main(void) { FILE *fp; char *fname = "C:\\Users\\XXX\\Desktop\\aaa.csv"; char s[100]; int ret, n1, n2; float f1, f2; fp = fopen( fname, "r" ); if( fp == NULL ){ printf( "%sファイルが開けません¥n", fname ); return -1; } while( ( ret = fscanf( fp, "%[^,],%d,%d,%f,%f", s, &n1, &n2, &f1, &f2 ) ) != EOF ){ printf( "%s %d %d %f %f", s, n1, n2, f1, f2 ); } fclose( fp ); return 0; }

  • C言語 配列

    ご質問させていただきます。 CSVファイルからデータを呼び出し、二次元配列として出力したいのですが上手くいきません。 CSVファイルには英数字が混ざっており、エクセルでいう、11行と1440列ほどのデータがあります。初心者なりに書いてみたのですが、どこから手を付けたらいいかわかりません。 三次元配列にしないといけないとのアドバイスをいただいたのですがどのようにすればいいかわかりませんヒントを頂けるとたすかります。 元のcsvファイルは例ですがこのような下記のような構造になっていて2行目にいったときに[0][0]から[1][0]と変わっていってほしいです。 testt,esttest,testte,stte,sttest testte,sttes,ttest,~ 理想 [0][0] = [testtesttest] [0][1] = [testtesttesttest] 一行が終わりしだい [1][0] = [testtesttesttest] と変わっていくようにしたいです。 エラーが出ますが、コードを記載させていただきます。 コード #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> int main(void) { //ストリームポインタ FILE *fp; int kk = 0; int nn = 0; int hoge; //ファイルから読み込んだテキスト1行分を格納するためのchar配列を指定します int piyo[11][1440]; //*filename : 開くファイル名を指定 char *fname = "./test1/test2/201509/test.csv"; //ファイルが無かったり,指定フォルダでなければ、FILE変数fpはNULLが返ります。 fp = fopen(fname, "r"); //NULLが返ってきた場合の処理 if (fp == NULL) { printf("%sファイルが開けません¥n", fname); return -1; } //ファイルから1行ずつ読み込む成功すると、読み込んだ文字列のポインタを返し、失敗すると、NULLを返します。 while (1 == fscanf(fp, "%c,", &hoge)) { piyo[kk][nn] = hoge; printf("[%d][%d]=%d\n", kk, nn, piyo[kk][nn]); nn++; if (1440 == nn) { kk++; nn = 0; } } //FILE *fp : fopen()で取得したファイルポインタ fclose(fp); return 0; }

  • C言語でCSVファイルのオープン・クローズができな

    C言語でCSVファイルのオープン・クローズができない。 下記のプログラムですが、CSVファイルが読み込めません。 どのようにすれば読み込めるのでしょうか。よろしくお願いいたします。 #include <stdio.h> int main(void) { FILE *fp; fp = fopen("aaa.csv","r"); if (fp == NULL) printf("ファイルを開けません。"); else { fclose(fp); } return(0); }

  • C言語  二次元配列

    C言語をやることになり苦戦しています。 CSVファイルからデータを呼び出し、二次元配列として出力したいのですが上手くいきません。 CSVファイルには英数字が混ざっており、エクセルでいう、11行と1440列ほどのデータがあります。初心者なりに書いてみたのですが、どこから手を付けたらいいかわかりません。 是非ヒントを頂けるとうれしいです。よろしくお願いします。 理想 [0][0] = [testtesttest] [0][1] = [testtesttesttest] 一行が終わりしだい [1][0] = [testtesttesttest] と変わっていくようにしたいです。 エラーが出ますが、コードを記載させていただきます。 コード #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> int main(void) { //ストリームポインタ FILE *fp; int kk = 0; int nn = 0; int hoge; //ファイルから読み込んだテキスト1行分を格納するためのchar配列を指定します int piyo[11][1440]; //*filename : 開くファイル名を指定 char *fname = "./test1/test2/201509/test.csv"; //ファイルが無かったり,指定フォルダでなければ、FILE変数fpはNULLが返ります。 fp = fopen(fname, "r"); //NULLが返ってきた場合の処理 if (fp == NULL) { printf("%sファイルが開けません¥n", fname); return -1; } //ファイルから1行ずつ読み込む成功すると、読み込んだ文字列のポインタを返し、失敗すると、NULLを返します。 while (1 == fscanf(fp, "%c,", &hoge)) { piyo[kk][nn] = hoge; printf("[%d][%d]=%d\n", kk, nn, piyo[kk][nn]); nn++; if (1440 == nn) { kk++; nn = 0; } } //FILE *fp : fopen()で取得したファイルポインタ fclose(fp); return 0; }

  • c言語プログラムについて

    http://www.post.japanpost.jp/zipcode/dl/kokagi.html から全国一括(1,735,160Byte)をダウンロード このファイルを使って、 Linuxマシン上で、 例えば、北海道札幌市中央区旭ケ丘 と入力すれば、0640941 と返却されるプログラム(引数はコマンドラインで)をcで作成したいと思っているのですが、ファイルのダウンロードとファイルの読み込みまでは出来たのですが、その後の「北海道札幌市中央区旭ケ丘 と入力すれば、0640941」からが分かりません。どなたか続きを教えて頂けないでしょうか? 使用OS:fedora 一応、ソースを載せておきます #include <stdio.h> int main(void){ FILE *fp; char *fname="ken_all.csv"; char d[100]; char e[100]; char f[100]; char g[100]; char h[100]; char i[100]; int ret,a,b,c; fp = fopen("ken_all.csv", "r"); if (fp == NULL) { printf("ファイルをオープンできませんでした\n",fname); return -1; } while( (ret = fscanf( fp, "%[^, ],%d,%d,%s,%s,%s,%s,%s,%s", &a, &b, &c, d, e, f, g, h, i ) ) != EOF ){ printf( "%d %d %d %s %s %s %s %s %s", a, b, c, d, e, f, g , h , i); } fclose(fp); return 0; }

  • c言語 sscanf の書式についての質問です

    C言語でCSVファイルの読み込みをしようとしています。CSVの中身は以下の2通りあります。 ・[ ] で囲った文字列(1行に1つだけ) ・データの並び(1行に2つ以上) 具体的には、[ ] で囲った文字列と、最初の2つのデータのみが抽出対象です。そこで以下のコードを書いてみましたが、最後に示すように、[ ] で囲った文字列がうまく抽出できません。以下のコードのようなsscanfの使い方は間違っているのでしょうか?正しく動作するにはどうすればよいか、教えて下さい。 ---------- 以下、ソースコード #include <stdio.h> #include <string.h> int main(void) {  FILE *fp;  char *fname = "test.csv";  char s1[32], s2[16];  int ret;  char str[128];    /* csvファイルの一行 */  char structName[32];  /* セパレータ名 */  fp = fopen( fname, "r" );  if( fp == NULL ){   printf( "%sファイルが開けません\n", fname );   return -1;  }  while( fgets( str, 128, fp ) != NULL ){      /* セパレータ */   if( str[0] == '[' ){    printf( "str = %s\n", str );    ret = sscanf( str, "[%s]\n", structName );    printf( "structName = %s\n", structName );    continue;   }      ret = sscanf( str, "%[^,],%[^,]", s1, s2 );      printf( "s1 = %s\n", s1 );   printf( "s2 = %s\n", s2 );  }  fclose( fp );  return ret; } ---------- 以下、"test.csv"の中身 [ABC] test01,10,11,1.0,1.1 test02,20,21,2.0,2.1 test03,30,31,3.0,3.1 [DEF] test04,40,41,4.0,4.1 ---------- 以下、実行結果 str = [ABC] structName = ABC] s1 = test01 s2 = 10 s1 = test02 s2 = 20 s1 = test03 s2 = 30 str = [DEF] structName = DEF] s1 = test04 s2 = 40

  • 型によらないCSVファイルの読み込みC言語プログラ

    あらかじめ型のわかっているN行*M列のエクセルデータをCSV形式にし、 読み込むプログラムを作成しました。 そのプログラムを下に示します #include <stdio.h> #include <stdlib.h> #include <string.h> /* 確保するデータ保存領域の大きさ(N行×M列) */ #define N 23 #define M 6 /* データの区切り文字 */ #define SEP_DATA ',' int csv_read(char filename[], double csv[N][M]) { /* ファイルオープン */ FILE *fp; if( (fp = fopen(filename, "r")) == NULL ) { printf(" file open error!!\n"); return -1; } /* 1行毎に読み出し */ char line[256], *ptr; int i, j, k; i=0; while (fgets(line, 256, fp) != NULL) { printf("*%s", line); ptr = line; j=0; do{ /* line[j]から次のタブ文字までを数値に変換 */ csv[i][j] = atof(ptr); /* 次のタブ文字の位置を探す */ ptr = strchr(ptr, SEP_DATA); /* タブ文字の次の文字を示す */ if (ptr!=NULL) { ptr++; } j++; }while(ptr!=NULL && j<M); i++; } /* ファイルクローズ */ fclose(fp); return 0; } int main(int argv, char *argc[]) { char filename[256]; if( argv > 1){ strcpy(filename, argc[1]); } else { printf("Please Input Filename:"); scanf("%s", filename); } /* データ保存用の領域を確保 */ double (*csvdata)[M]; csvdata = (double(*)[M])malloc(sizeof(double[M]) * N); //malloc(sizeof(*csvdata) * N); if ( csvdata == NULL ){ return -1; } int i,j; /* 配列の初期化 */ for( i=0; i<N; i++) { for( j=0; j<M; j++) { csvdata[i][j] = 0.0; } } /* CSVデータの読み込み */ if( csv_read(filename, csvdata) < 0 ) { return -1; } /* 配列の出力 */ for( i=0; i<N; i++) { printf("%lf", csvdata[i][0]); for( j=1; j<M; j++) { printf("\t%lf", csvdata[i][j]); } printf("\n"); } free(csvdata); csvdata = NULL; return 0; } これをNとMがどんな値であれ読み込めるようにするにはどうすれいいでしょうか

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

  • VBAとC言語でwavファイル再生

    VBAとCのプログラムについてどなたかアドバイスしていただけませんか? 特定のcsvファイルに1が入ったら指定のwavファイルを再生させるプログラムを作りたいのですが、 どうしてもエラーになってしまいます。 (必ずどこかのcsvに1が入り、その他のcsvには0が入るようにしています。) 以下にVBAとCのプログラムを載せます。 ちなみに、VBAはopen1と同様の内容をopen10まで行い、read1も同様にread10まで行います。 Sub open1() Dim buf As String Open "C:\Users\Documents\Debug\file1.csv" For Input As #1 Do Until EOF(1) Line Input #1, buf Cells(1, 1) = buf Open "C:\Users\Documents\Visual Studio 2008\Projects\PlaySound\Debug\1.csv" For Output As #2 Print #2, buf Close #2 Loop Close #1 End Sub Sub read1() Dim FlNum As Long, FlName As String, Atai As Variant FlNum = FreeFile FlName = "C:\Users\\Documents\Debug\file1.csv" Open FlName For Output Access Write As #FlNum Atai = Range("A1") Print #FlNum, CStr(Atai) Close #FlNum End Sub これでcsvの内容をコピーさせています。 そして、Cのプログラムが以下です。 #include "stdafx.h" #include <windows.h> #include <mmsystem.h> #include<stdio.h> #include<time.h> #include<windows.h> #pragma comment (lib,"winmm.lib") FILE *fp1; FILE *fp2; FILE *fp3; FILE *fp4; FILE *fp5; FILE *fp6; FILE *fp7; FILE *fp8; FILE *fp9; FILE *fp10; int _tmain(int argc, _TCHAR* argv[]) { //引数 int s; int t; int u; int v; int w; int x; int y; int z; int z1; int z2; //回数表現 int a=1; int b=1; int c=1; int d=1; int e=1; int f=1; int g=1; int h=1; int h1 = 1; int h2 = 1; while(1){ Sleep(2000); fp1 = fopen("1.csv","r"); fp2 = fopen("2.csv","r"); fp3 = fopen("3.csv","r"); fp4 = fopen("4.csv","r"); fp5 = fopen("5.csv","r"); fp6 = fopen("6.csv","r"); fp7 = fopen("7.csv","r"); fp8 = fopen("8.csv","r"); fp9 = fopen("9.csv","r"); fp10= fopen("10.csv","r"); printf("finish to open csv file\n"); fscanf(fp1,"%d",&s); printf("finish to scan file1.csv %d\n", &s); fscanf(fp2,"%d",&t); fscanf(fp3,"%d",&u); fscanf(fp4,"%d",&v); fscanf(fp5,"%d",&w); fscanf(fp6,"%d",&x); fscanf(fp7,"%d",&y); fscanf(fp8,"%d",&z); fscanf(fp9,"%d",&z1); fscanf(fp10,"%d",&z2); printf("finish to scan csv file\n"); if(s==1&&a==1){ ::PlaySound(_T("what.wav"),NULL, SND_FILENAME); b = 1; c = 1; d = 1; e = 1; f = 1; g = 1; h = 1; h1 = 1; h2 = 1; a++; } (同様にif文がcsvのそれぞれにつきあるのと、fcloseもありますが、省略します。) ビルドは正常終了するのですが、デバッグすると以下のエラーメッセージが出ます。 Debug Assertion Failed! Proogram:...\Debug\PlaySound.exe File:f:\dd\vctools\crt_bld\self_x86\crt\src\fscanf.c Line:52 Expression:(stream != NULL) For information on how your program can cause an assertion failure, see the Visual C++ documentation on asserts. (Press Retry to debug the application) 中止(A)再試行(R)無視(I) 試しにDebugフォルダにできた実行ファイルを開くと printfできちんと出力もできてますし、 csvファイルもきちんと出力できています。 wavファイルを再生させるにはどうしたらいいでしょうか。

  • ファイルの内容の表示

    実行時のコマンドライン引数で指定したファイルの内容を、行番号付きで画面に表示するプログラムを作る という問題です。ヒントも与えられています。 行番号付きの表示、コマンドライン引数の利用。両者を組み合わせればできるはずだ >  main関数の引数にargcとargvを指定して、コマンドライン引数をファイル名として利用する。キーボード入力を促す文(プロンプト)や改行チェックは不要なので書かないこと >  コマンドライン引数が指定されない場合は、メッセージを表示してプログラムを終了 >  ファイルの内容を画面表示する処理は、ユーザー定義関数put_file_contentsに記述する。仮引数には文字型のポインタ変数をひとつ指定し、ファイル名を受け渡せるようにする。put_file_contents自体の型は整数型(int)で、正常終了なら返り値0を返すこと。 行番号付きのプログラム#include<stdio.h> > int put_file(char *filename); > > int main() > { > char line[50]; > char *ptr; > > printf("ファイル名を入力:"); > fgets(line,sizeof(line),stdin); > ptr = line + strlen(line) - 1; > if(*ptr == '\n') { > *ptr = '\0'; > } > > put_file(line); > > return 0; > } > > int put_file(char *filename) > { > FILE *fp; > char buf[100]; > int line_no; > > fp = fopen(filename,"r"); > if (fp == NULL){ > printf("%sを開けません\n",filename); > return 1; > } > line_no = 1; > while (fgets(buf,sizeof(buf),fp) != NULL){ > printf("%3d: ",line_no); > printf("%s",buf); > line_no++; > } > fclose(fp); > > return 0; > } で、コマンドライン引数のプログラムは#include<stdio.h> void write_key_inputs(char *filiname); int main(int argc, char *argv[1]) { write_key_inputs(argv[1]); return 0; } void write_key_inputs(char *filename) { FILE *fp; char buf[100] ; fp = fopen(filename,"w"); while(fgets(buf, sizeof(buf),stdin) != NULL) { fputs(buf, fp); } fclose(fp); return ; } です。これらを組み合わせて少しいじると出来るみたいなのですが、できていません。ちなみに私が考えたプログラムは #include<stdio.h> int put_file_contents(char *filename); int main(int argc,char *argv[]) { int i; if(argc == 1){ printf("コマンドライン引数がありません\n"); return 1; } for(i = 0;i<argc;i++) printf("argv[%d]は「%s」です\n",i,argv[i]); put_file(i); return 0; } int put_file(char *filename) { FILE *fp; char buf[100]; int line_no; fp = fopen(filename,"r"); line_no = 1; while (fgets(buf,sizeof(buf),fp) != NULL){ printf("%3d: ",line_no); printf("%s",buf); line_no++; } fclose(fp); return 0; } です。コマンドライン引数は表示されるのですが、行番号が表示されません。どうしたらいいでしょうか??

専門家に質問してみよう