• 締切済み

C言語でのCSVファイルの読み出し方法

C言語の勉強をしています。 test.csvというファイル名のCSVファイルで 項目,名前,身長,体重,血液型,合否(合格なら○不合格なら空欄) 1,太郎,150,55.6,A,○ 2,二郎,165.5,60,B 3,三郎,160.2,59.5,AB,○ と書かれたファイルを読もうと思いまして #include <stdio.h> #define i 1000 #define j 1000 main() { int d[i][j]; double... FILE *fp; fp=fopen(fp,"test.csv","r"); for(i=0;i<=2;i++) { for(j=0;j<=6;j++) { fscanf(fp,"%d",d[i][j]); } }... という感じで書いても読み込みません。 どのように書いたら読み込むでしょうか。 Cをはじめて間もないのでどなたか教えていただけないでしょうか よろしくお願いします。

みんなの回答

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.9

>各行内に空のセルがある場合 空のセルがある場合、strtokは使えません。 sscanfなら、空のセルにも対応できますが、カンマを含むセルがある場合はやはり対応できません。 1,あ,"a,b" というのです。 さらに、規格上は、改行を含むセル、なんてのも存在します。こうなると、fgetsすら使えません。 なので、本気でやろうと思ったら、既存の関数はあてにならず、全部自力で処理する必要があります。 とはいえ、実際にはある程度フォーマットを限定できる場合が多いです。 ご提示の例であれば、fgetsとsscanfの組み合わせが現実的だと思います。

noname#137556
noname#137556
回答No.8

#7 です。間違えました。 誤: ret = sscanf(buf, "%d,%[^,],%lf,%lf,%[^,],%[^,^\n]", &n, s1, &x, &y, s2, s3); 正: ret = sscanf(buf, "%d,%[^,],%lf,%lf,%[^,],%[^,\n]", &n, s1, &x, &y, s2, s3); # あと、カンマ入の要素は言うまでもなく、空の要素があったりすると破綻します。 # 個人的なちょっとしたデータ処理ぐらいになら使えるかも。

noname#137556
noname#137556
回答No.7

scanf 系の関数でも一応できます。書式指定文字列中の "%[^,]" は ',' 以外の文字にマッチします。 char buf[256] = "1,太郎,150,55.6,A,○\n"; // fgets で読んだつもりのデータ // char buf[256] = "2,二郎,165.5,60,B"; int n, ret; double x, y; char s1[256], s2[256], s3[256] = ""; ret = sscanf(buf, "%d,%[^,],%lf,%lf,%[^,],%[^,^\n]", &n, s1, &x, &y, s2, s3); // 表示してみます printf("%d\n", ret); printf("%d\n", n); puts(s1); printf("%f\n", x); printf("%f\n", y); puts(s2); puts(s3); 上では手抜きしてますが、最低限、文字列を格納するバッファがオーバーフローしないようにすることと、sscanf の戻り値のチェックぐらいは必要です。

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.6

ちなみに、データがない可能性があるのが最後の合否部分だけなら、こんな邪道回答もあります。 前提として構造体・共用体を知っている必要はあります。 #include <stdio.h> #define LINE_LEN 256 typedef union {  struct {   char *num;   char *name;   char *height;   char *weight;   char *blood;   char *result;  } param;  char *array[6]; } record; int main() {  FILE *fp = fopen("test.csv", "r");  char line[LINE_LEN];  record data;  char *tmp;  int i;  while(fgets(line, LINE_LEN, fp) != NULL)  {   i = 0;   tmp = strtok(line, ",");   do   {    data.array[i] = tmp;    tmp = strtok(NULL, ",\n");    i ++;   } while(tmp != NULL);   if(i < 6) data.result = "×";   printf("項番:%s 名前:%s 身長:%s 体重:%s 血液型:%s 結果:%s\n",    data.param.num, data.param.name, data.param.height, data.param.weight, data.param.blood, data.param.result);  } } 一行ずつ読んではstrtok()で分解して表示、を繰り返しています。 複数のデータを持ちたい場合にはdataを配列にしましょう。 全て文字列で持っているので数値で扱いたい場合にはそれなりの対応が必要です。 また要素が4個以下(血液型がない場合)などのデータ自体の整合性は見ていないので不正データがあった場合には、このままではコケます。 なお、strtok()は「返すべきトークンが存在しない」状況になったらNULLを返します。 常に返り値チェックをして「返り値をチェックしないまま扱おうとしてAccess Violation」なんて事にならないように気をつけましょう。

回答No.5

「strtok()に苦戦している」とのことですが、「2,二郎,165.5,60,B,」の末尾がメモリにどのように展開されているかを知ることが strtok() をマスターするキーポイントではないでしょうか。 CSVファイルは fgets()を使って読み込みますが、読み込まれた「2,二郎,165.5,60,B,」の行の末尾の展開は 2,二郎,165.5,60,B,\n\0 となっています。 これをクリアするために strtok(NULL,",\n") とすると bus error が出てうまくいきません。 アドレスが \n を認知できず、読み込んだメモリ領域を超えてしまったことによる error と考えられます。 そこで \n の次は \0 にメモリ展開されていますから、strtok(NULL,"\0") とすると error は起こりません。 しかし、改行コードの \n が読み込まれるため、これを排除する新たな作業が必要となります。 *(ptr->judge+strlen(ptr->judge)-1)='\0'; ----- データファイル ----- 1,太郎,150,55.6,A,○ 2,二郎,165.5,60,B, 3,三郎,160.2,59.5,AB,○ #include <stdio.h> #include <string.h> //strtok(),strcpy() #include <stdlib.h> //exit(),atoi() #define SIZE 256 #define NUMBER 50 struct set1 { int code; char name[32]; float height; float weight; char blood[3]; char judge[3]; }; int main(int argc, char *argv[]) { struct set1 member[NUMBER], *ptr; char buffer[SIZE], work[12]; //作業用バッファ char *read_file; //読み込みファイル名 int lines; //読み込み行数 FILE *fp; int j; if (argc!=2){ printf("parameter error.\n"); exit(1); } read_file=argv[1]; if ((fp=fopen(read_file, "r"))==NULL){ printf("%s file can't open.\n",read_file); exit(1); } lines=0; while(fgets(buffer, SIZE, fp)!=NULL) { if(lines>= NUMBER){ printf("buffer overflow error!"); exit(1); } ptr = &member[lines]; ptr->code=atoi(strcpy(work,strtok(buffer,","))); strcpy(ptr->name,strtok(NULL,",")); ptr->height=atof(strcpy(work,strtok(NULL,","))); ptr->weight=atof(strcpy(work,strtok(NULL,","))); strcpy(ptr->blood,strtok(NULL,",")); strcpy(ptr->judge,strtok(NULL,"\0")); *(ptr->judge+strlen(ptr->judge)-1)='\0'; lines++; } fclose(fp); for (j=0; j<lines; j++) { ptr=&member[j]; printf("\t番号= %d, ", ptr->code); printf("名前= %s, ", ptr->name); printf("身長= %.1f, ", ptr->height); printf("体重= %.1f, ", ptr->weight); printf("血液型= %s, ", ptr->blood); printf("合否= %s\n", ptr->judge); } return 0; }

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.4

一箇所書き間違えました。 > 4.検索開始位置をカンマの次に移動して3に戻る、以下カンマが見つからなくなるまで繰り返し 4.検索開始位置をカンマの次に移動して”2”に戻る、以下カンマが見つからなくなるまで繰り返し です。

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.3

認識されている通りcsvのエレメント分割は単純にはいかない訳です。 #2で指摘されている部分の他にもエレメント内の"の扱いとかありますしね。 まぁ今回は「csvそのもの」ではなく「csvっぽいもの」として、ファイルフォーマットを以下に限定して考えることにしましょう。 ・要素に改行文字・ダブルクォーテーションは含まない(必ず1行でデータが完結する) ・空要素はある このとき、要素を取るためにはどうすればいいかという事を考える訳ですが、 1.1行読む(fgets()) 2.検索開始位置を行頭に置く 2.検索開始位置から最初にあるカンマ位置を取得する(strchr(), strcspn()など) 3.検索開始位置からカンマ位置までを切り出す(strncpy()など、終端処理を忘れずに) 4.検索開始位置をカンマの次に移動して3に戻る、以下カンマが見つからなくなるまで繰り返し 5.1に戻る、以下行が読めなくなるまで繰り返し という手順を踏むことになるでしょう。 本来のちゃんとしたcsvに対応するにはこれでは駄目ですが、質問の内容についてはこの手順で問題ないはずです。

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.2

すでに書かれているとおり、"%d"で読み込もうとしているから…です。 ","は数字ではありませんから、ココで止まるでしょうね。 "太郎"も"A"も"○"も数字ではありませんけどね…。 しかも例の場合CSVとして正しいのか… 二郎の行は 2,二郎,165.5,60,B, となるハズです。 1行読み込みして、strtok()でカンマで区切る。 なんてのがCSV読み込みでよくあるパターンですが……コレもアウトです。 # 「入門者向けの難易度とは言い難い」と言われる由縁。 なぜか初心者向けでCSV読み込みが例題に出されるパターンをよく見かけますが… 「ちゃんと」処理しようとした場合、どう見ても初心者向けではありません。 # データの入っていない場合は? データ中に","が含まれる場合は? データ中に改行が含まれている場合は? などなど。 以下、蛇足ですが… このコードはコンパイル通りますかね? >#define i 1000 >#define j 1000 >int d[i][j]; ここまではよいでしょう。 # iとかjをdefine定義することの是非は置いておきますが。 >for(i=0;i<=2;i++) >for(j=0;j<=6;j++) 定数をfor文のカウンタに使うのはいかがかと。 ちなみに、上のは… for(1000=0;1000<=2;1000++) for(1000=0;1000<=6;1000++) と同等になります。 # 1000=0と1000++が微妙。1000<=2は常に偽なので…最適化で丸ごと消える?? >fscanf(fp,"%d",d[i][j]); バッファオーバーランしてます。iとjは定数ですが…二次元配列dはそんな添え字は許可されません。 # まぁ、for文の条件からココには来ないハズですが。

aiue_7
質問者

お礼

いろいろとコメントありがとうございます。 ちょっと勉強して出直してきます。

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

scanf系の%dは数値がいない場合そこで解析を止めます。 また、「csvを読む標準関数」は存在しないのでいずれにせよその方法ではカンマで区切ることができません。 Cを始めて間もないのなら、まずは基礎を固めるのに時間をかけるべきです。 この課題自体は入門者向けの難易度とは言い難いので、例を提示すること自体は難しくはないのですが恐らくそちらが理解できないでしょう。

aiue_7
質問者

お礼

コメントありがとうございます。 文字と数値の入り混じったCSVファイルの読み方、また、各行内に空のセルがある場合 どうしたらいいのかわからなく投稿しました。 strtok関数とかも自分なりに使用してみたのですがなかなかうまくいかず、苦戦してます。 もう一度勉強してTRYしてみます。

関連するQ&A

  • scanf C言語

    現在取得したデータを多次元配列いれたいのですが、カンマまでの文字列を入れる方法がわかりません。例で言いますと jgasogasog,dklafh343,fdjalsjfd,kldjfas5 dfasfdas6ff ,fsadfa6sg,dgas6dsa,fsdafa もカンマまでの文字列array[0][0] = jgasogasog array[0][1] = dklafh34 といった形で入れていきたいです。 ご迷惑おかけしますが何卒よろしくお願いします。 途中まで作ったソースをのせます。 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include<string.h> #define piyo 2 #define hoge 1400 int main(void) { FILE *fp; char test[10][500]; int n = 0; if ((fp = fopen("testfile.csv", "r")) == NULL) { printf("\aファイルをオープンできません\n"); return(0); } int i, j; int k = 0; //ファイルfpの終端指示子をチェックします。 while (!feof(fp) && k < 500) { //%cは一文字出力をしてくれる使用データ型はchar型 //fscanf関数は書式指定をしてファイルから値を読み込み、バッファに格納します。 for (i = 0; i < 10; i++) { for (j = 0; j < 500; j++) { fscanf(fp, "%[^,],%d", &test[i][j]); k++; } } } for (i = 0; i < 10; i++) { for (j = 0; j < 500; j++) { printf("test[%d][%d]=%d\n", i,j,test[i][j]); } } fclose(fp); return(0); } 似たような質問をしてすいません。

  • C言語 csv 配列

    CSVファイルを2次元配列に格納したいのですが、書き方がわかりません。 csvファイルは1024×2048の0と1のみで構成されています。 fp=fopen(path,"r"); for(j=0; j<1024; j++) { for(i=0; i<2048; i++) { char c; do{c=(getc(fp));} while(c==','||c=='\n'||c=='\r'); map[j][i] = c-'0'; } } このように書きできたと思ったのですが、どうもうまくいっていないみたいです。 どこが悪いのか、どういう風に書けばいいのか教えていただげれば幸いです。

  • csvファイルを読み込んで二次元配列に格納したい

    200×250のある数字と文字の入力されたcsvファイル(またはtxtファイル)を読み込んで2次元配列に格納したいのです。 色々調べるとカンマの処理が必要ということがわかりましたが、どのようにソースを書けばよいかわかりません。使用言語はC言語です。 また、実際にcsvファイルを読み込むようにプログラムを書いてみましたが、すべて-858993460となって表示されます。 プログラミング初心者で勉強中なため困っています。 回答よろしくお願いします。 #include <stdio.h> #include <stdlib.h> #define row 200 #define column 250 int main() { int i, j; int data[row][column]; FILE *fp; fp = fopen("sample.csv", "r"); if (fp == NULL){ printf("ファイルがありません\n"); return 1; } for (i = 0; i < row; i++){ for (j = 0; j < column; j++){ fscanf(fp, "%lf", &data[i][j]); } } for (i = 0; i<row; i++){ for (j = 0; j < column; j++){ printf("%3d ", data[i][j]); } printf("\n"); } fclose(fp); return 0; }

  • 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ファイルを再生させるにはどうしたらいいでしょうか。

  • c言語の初心者なんですけど、ファイルからの読み込みで、文字や,や数字を

    c言語の初心者なんですけど、ファイルからの読み込みで、文字や,や数字を読み込みたいんですけど できません。 おしえてください。 プログラムは・・・・ #include<stdio.h> #include<ctype.h> int main(void){ char x[500][4]; FILE *fp; int i,j; fp=fopen("data2.txt","r"); for(i=0;i<500;i++){ for(j=0;j<4;j++){ fscanf(fp,"%c",&x[i][j]); } printf("%c,%d,%d,%d\n",x[i][0],x[i][1],x[i][2],x[i][3]); } fclose(fp); } ファイルは 田中,5,abc,18 鈴木,89,57,21 佐藤,,8,69 高橋,95,9,7

  • 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行目だけは読めますが、それ以降がわかりません。 配列を使えばいいのでしょうか?

  • Borland C CSVファイル読み込み

    CSVファイルを読み込み、読み込んだ値で計算を行うプログラムを作っています。 ・環境はWindows VISTA UltimateでBorland C++ Compiler 5.5  ・CSVファイルのデータの形式は 1,4532 4,2131 6,4301 . . ・データ数は決まっていて今のところ全部で12個 そして以下のようにCSVの読み込みプログラムを試しに組んだ所、実行時エラーがでました。 #include <stdio.h> #include <stdlib.h> #include <string.h> void main(void) { int AN[11][1]; int i=0,j=0,c=0; char buff[1024], *tp; FILE *fp; /*配列初期化*/ for(i=0;i<11;i++) { for(j=0;j<2;j++) { AN[i][j]=0; } } fp=fopen("test1.csv","r"); if(fp==NULL) { /* オープン失敗 */ printf("ファイルがオープンできません\n"); exit(1); /* 強制終了 */ } while( fgets(buff, 1024 , fp) != NULL ) { tp=strtok(buff , ","); if (tp !=NULL) {AN[i][j] = atoi(tp);} printf("%d\n",AN[i][j]); tp = strtok(NULL , ","); if (tp !=NULL) {AN[i][j+1] = atoi(tp);} printf("%d\n",AN[i][j+1]); i++; } fclose(fp); } 実行するとファイルクローズの後、問題が発生したためプログラムを終了しましたと出ます。"AN[i][j]=atoi(tp)"の配列部分を単純に変数にするとこのようなエラーは出ないのですが。 なぜエラーが出るのか、どなたかご教授願います。

  • C言語 ファイル処理

    今、c言語のファイル処理の勉強をしているのですが。 あるファイルfp1に 106 106 106 102 177 183 123 125 105 102 101 111 というデータが入っていたとして、 このファイルfp1からこのデータを2次元配列m[i][j]に入れたいんですけど、 一応プログラム書いてみましたがうまくいきません。 for(i=0;i<3;i++){   for(j=0;j<4;j++){     fscanf(fp1,"%d",&x); /*データ読み込み*/  m[i][j]=x;     }   } for(i=0;i<3;i++){   for(j=0;j<4;j++){     printf("%d ",m[i][i]);   }   putchar('\n'); } 変数宣言部、ファイルオープン部などは省略しました。 このプログラムを実行すると。 106 106 106 106 106 106 106 106 106 106 106 106 102 102 102 102 177 177 177 177 183 183 183 183 123 123 123 123 125 125 125 125 105 105 105 105 102 102 102 102 101 101 101 101 111 111 111 111 みたいな感じで表示されます。何ででしょうか? アドバイスお願いします。

  • C言語、CSVファイルを読み込んで、加工して別CS

    C言語、CSVファイルを読み込んで、加工して別CSVファイルに出力するプログラムがうまくいきません。 行いたいことは A列 B列 ←エクセルの列です。 1   -0.0001 2   -0.000021 3   -0.1111 4   -0.255 5   -0.223 というCSVファイルの中身を加工してB列の数値のみを変えたいのですが、うまくいくません。作成したプログラムでは A列    B列 1 0000 2 0000 3 0000  4 0000 5 0000  となり、うまく数値が読み込めていません。-だからでしょうか。 また全てA列に入力されてしまいます。 以下作成したプログラムになります。 #include <stdio.h> #define N 5 int main(void) { int i; double r[N], w[N - 1]; FILE *fpr = fopen("C:\\Users\\XXX\\Desktop\\aaa.csv", "r"); for (i = 0; i < N; ++i) { fscanf(fpr, "%*d %lf", &r[i]); } fclose(fpr); for (i = 0; i < N - 1; ++i) { if (i == 0) { w[0] = r[0] + r[0]; } else { w[i] = w[i - 1] *(r[i]-w[i + 1]); } } FILE *fpw = fopen("C:\\Users\\XXX\\Desktop\\bbb.csv", "w"); for (i = 0; i < N - 1; ++i) { fprintf(fpw, "%d %.5lf\n", i + 1, w[i]); } fclose(fpw); return 0; } お手数ですが、よろしくお願いいたします。

  • C言語でファイルから複素数の値を読み込んで表示させるプログラムを作って

    C言語でファイルから複素数の値を読み込んで表示させるプログラムを作っています。 扱う値が実数のみの場合に関しては問題ないのですが、 複素数を読み込む時には、実数のみの場合や、虚数のみの場合もあり、 どう読み込んでいいか分からず、アドバイスを戴きたいと考えております。 それ以外のデータの取り扱い自体は問題ないと思います。 下は実数の値を読み込むプログラムとデータセット、 それを拡張した複素数の値を読み込むプログラムとデータセットになっております。 アドバイス、よろしくお願いいたします。 -------------------------------------------------------------------------------- /*データセット sample.dat*/ 4 3.5 -2 9 12 37.8 65.4 0.4 79.5 3 23.4 5.3 -------------------------------------------------------------------------------- /*プログラム本体 read.c*/ #include <stdio.h> #include <stdlib.h> #define LOW 3 #define COLUMN 4 int main(void){ int i,j; double x[LOW][COLUMN]; if((fp = fopen("sample.dat","r"))==NULL){ printf("The file is not found. : sample.dat \n"); exit(1); } for(i=0;i<LOW;i++){ for(j=0;j<COLUMN;j++){ fscanf(fp,"%lf",&x[i][j]); } } for(i=0;i<LOW;i++){ for(j=0;j<COLUMN;j++){ printf("%lf\n",x[i][j]); } } return 0; } -------------------------------------------------------------------------------- /*データセット sample_C.dat*/ 4+i i -2 9+i 12 37.8-i 65.4i 0.4+i 79.5 3+i 23.4 5.3 -------------------------------------------------------------------------------- /*プログラム本体 read_C.c*/ #include <stdio.h> #include <stdlib.h> #define LOW 3 #define COLUMN 4 typedef struct{ double re; double im; }C_double; int main(void){ int i,j; C_double x[LOW][COLUMN]; if((fp = fopen("sample_C.dat","r"))==NULL){ printf("The file is not found. : sample_C.dat \n"); exit(1); } /*改良したい読み込み部分*/ for(i=0;i<LOW;i++){ for(j=0;j<COLUMN;j++){ fscanf(fp,"%lf",&x[i][j].re); fscanf(fp,"%lf",&x[i][j].im); } } for(i=0;i<LOW;i++){ for(j=0;j<COLUMN;j++){ if(x[i][j].re!=0){ if(x[i][j].im!=0){ printf("x[%d][%d]=%lf+%lfi\n",i,j,x[i][j].re,x[i][j].im); } else{ printf("x[%d][%d]=%lf\n",i,j,x[i][j].re); } } else{ if(x[i][j].im!=0){ printf("x[%d][%d]=%lfi\n",i,j,x[i][j].im); } else{ printf("x[%d][%d]=0\n",i,j); } } } } return 0; }

専門家に質問してみよう