C言語初心者がcsvファイルを構造体に読み込む方法について

このQ&Aのポイント
  • C言語初心者がcsvファイルを構造体に読み込む方法について質問します。
  • csvファイルのデータを1行ずつ構造体に読み込みたいのですが、うまくできません。
  • 16進数を文字列として構造体に入れるときに、次の文字(英字)まで一緒に含んでしまう問題が発生しています。解決方法を教えてください。
回答を見る
  • ベストアンサー

csvファイルを構造体に読み込みたい

C言語初心者です。 csvファイルのデータを1行ずつ構造体に読み込みたいのですが、うまくできません。 #define MAX_SIZE 100 char filename[] = ″test.csv"; struct ALL_DATA{ int cnt; char list[10]; char addr[10]; char cmd[10]; char csize[10]; char input[10]; char icmd[10]; char input2[10]; }; for (int lp = 0; lp < 10; lp++){ FILE *fp; struct ALL_DATA ADATA[MAX_SIZE]; // 構造体配列の宣言 if ((fp = fopen(filename, "r")) == NULL){ printf("%s open error !\n", filename); exit(1); } for (fc = 0; fc < MAX_SIZE; fc++) { if (feof(fp)){ break; } else{ fscanf(fp, "%d,%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],\n", &ADATA[fc].cnt, ADATA[fc].list, ADATA[fc].addr,ADATA[fc].cmd,ADATA[fc].csize,ADATA[fc].input,ADATA[fc].icmd,ADATA[fc].input2); } } fclose(fp); while (i < MAX_SIZE){ printf("ADATA[i].cnt -> %d, ADATA[i].list -> %s, ADATA[i].addr -> %s, ADATA[i].cmd -> %s, ADATA[i].csize -> %s, ADATA[i].input -> %s, ADATA[i].icmd -> %s, ADATA[i].input2 -> %s\n",ADATA[fc].cnt, ADATA[fc].list,ADATA[fc].addr,ADATA[fc].cmd,ADATA[fc].csize,ADATA[fc].input,ADATA[fc].icmd,ADATA[fc].input2); i++; } } 読み込みたいcsvデータは 1 test 0x0012 write 0x001 yes 0xabc yes 2 testa 0x00cd read 0x024 0x1a3 のように、「数字、文字列・・・」と並んでいます。 このデータを取り込んで表示させたところ、 最初の数字は問題ないのですが、ADATA[i].addr から値がおかしくなり、 ADATA[i].addr = 0x0012write ADATA[i].cmd = write ADATA[fc].csize = 0x001yes のように、16進数を文字列として構造体に入れるときに、次の文字(英字)まで一緒に含んでしまう現象が出ております。 ネットで調べて、csvファイルから構造体に取り込む方法はいくつか見たのですが、同じようにしている(と思っている)のにうまくいかないため、質問させていただきました。 原因がわかる方がいらっしゃいましたら、アドバイスをよろしくお願いいたします。

  • sgurk
  • お礼率50% (3/6)

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

  • ベストアンサー
  • wormhole
  • ベストアンサー率28% (1621/5656)
回答No.3

>fscanfの使い方が間違っているのでしょうか? 構造体のid2からはcharの配列のサイズが、'\0'文字分の計上がされていないように見えますけど。 それと質問に元のソースと異なるソースを書かれるのは構いませんが少なくとも現象が再現できるものにしましょう。

sgurk
質問者

お礼

wormholeさん ご回答、ありがとうございました。 charの配列サイズを修正したところ、目的の結果が得られることを確認できました。 いろいろと不手際があったにもかかわらず、最後までご対応いただきましてありがとうございました。 >それと質問に元のソースと異なるソースを書かれるのは構いませんが少なくとも現象が再現できるものにしましょう。 こちら、最初に貼り付けたものが動作しないものということだったので、再度現象再現するものを貼り付けさせていただいたのですが、こちらも動作しなかったでしょうか? 何度も不手際が合ったようで、今後質問する際には注意したいと思います。

その他の回答 (2)

  • wormhole
  • ベストアンサー率28% (1621/5656)
回答No.2

>これはcsvファイルではないのでしょうか? >拡張子はcsvとなっているのですが・・・ カンマで区切られているならcsvファイルです。 前回の回答にComma Separated Valueと書いてますけど意味調べて見ました? >最初の数字は問題ないのですが、ADATA[i].addr から値がおかしくなり、 質問に書かれているものが実際の物かどうかわかりませんが(そのままじゃコンパイルできないし)、 >printf("ADATA[i].cnt -> %d, ADATA[i].list -> %s, ADATA[i].addr -> %s, ADATA[i].cmd -> %s, ADATA[i].csize -> %s, ADATA[i].input -> %s, ADATA[i].icmd -> %s, ADATA[i].input2 -> %s\n",ADATA[fc].cnt, ADATA[fc].list,ADATA[fc].addr,ADATA[fc].cmd,ADATA[fc].csize,ADATA[fc].input,ADATA[fc].icmd,ADATA[fc].input2); は、本当にADATA[i].cnt,ADATA[i].list,...の値を出力していますか? よく見てみてください。

sgurk
質問者

補足

wormholeさん 返信が遅くなりました。 説明が悪かったので、少しコードを修正して確認したものを記載します。 #include <stdio.h> #include <stdlib.h> #define CSV_SIZE 20 int main(int argc, char *argv[]){ char Log[512]; // csvファイルを構造体へ格納 char filename[] = "/home/nvme/ubuntu_test/sample/test/testlist.csv"; struct CSV_DATA{ int id; char id2[10]; char cmd[5]; char id3[10]; char oaddr[10]; char oaddr2[10]; char format[3]; char size[10]; char format2[3]; }; FILE *fp; struct CSV_DATA CSVD[CSV_SIZE]; // 構造体配列の宣言 if ((fp = fopen(filename, "r")) == NULL){ printf("%s open error !\n", filename); exit(1); } for (int fc = 0; fc < CSV_SIZE; fc++) { if (feof(fp)){ break; } else{ fscanf(fp, "%d,%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%s\n", &CSVD[fc].id, CSVD[fc].id2, CSVD[fc].cmd, CSVD[fc].id3, CSVD[fc].oaddr, CSVD[fc].oaddr2, CSVD[fc].format, CSVD[fc].size, CSVD[fc].format2); } printf("********** id:%d id2:%s cmd:%s id3:%s oaddr:%s oaddr2:%s format:%s size:%s format2:%s *********\n", CSVD[fc].id, CSVD[fc].id2, CSVD[fc].cmd, CSVD[fc].id3, CSVD[fc].oaddr, CSVD[fc].oaddr2, CSVD[fc].format, CSVD[fc].size, CSVD[fc].format2); } } 読込むCSVファイルは以下になります。 6,0x00060001,Write,0x00000001,0x005bea30,0x00000000,Yes,0x0000001f,Yes 7,0x00030000,Flush,0x00000001,0x00000000,0x00000000, ,0x00000000, , 1,0x00340001,Write,0x00000001,0x00600848,0x00000000,Yes,0x00000007,Yes のような値が入っています。 これを実行すると、 id:6 id2:0x00060001Write0x000000010x005bea300x00000000Yes0x0000001fYes,, cmd:Write0x000000010x005bea300x00000000Yes0x0000001fYes,, id3:0x000000010x005bea300x00000000Yes0x0000001fYes,, oaddr:0x005bea300x00000000Yes0x0000001fYes,, oaddr2:0x00000000Yes0x0000001fYes,, format:Yes0x0000001fYes,, size:0x0000001fYes,, format2:Yes,, ********* のような値になってしまいます。 id2以降に構造体に入っている値が取得したい値から最後のYesまでになっております。 fscanfの使い方が間違っているのでしょうか?

  • wormhole
  • ベストアンサー率28% (1621/5656)
回答No.1

読み込みたいcsvデータは本当に 1 test 0x0012 write 0x001 yes 0xabc yes 2 testa 0x00cd read 0x024 0x1a3 になってるんですか? もしそうならCSV(Comma Separated Value)データではありませんけど。

sgurk
質問者

補足

wormholeさん 回答ありがとうございます。 読み込みたいファイルをメモ帳で開くと、下記のようになっております。 1,test,0x0012,write,0x001,yes,0xabc,yes 2,testa,0x00cd,read,0x024,,0x1a3, これはcsvファイルではないのでしょうか? 拡張子はcsvとなっているのですが・・・ 記載時に「,」が抜けていたためcsvではないと思われたのであれば、私の誤記です。すいませんでした。

関連するQ&A

  • テキストデータから構造体にデータを保存する方法

    C言語初心者です。 大きなテキストデータ(730MB)からデータを取得して、構造体に保存し表示するというプログラムを作成しています。テキストのサイズが大きいため構造体のサイズを400000とし、 残りをftellとfseekを使用してファイルポインタをずらして全データを順次読み込んで表示しようとしているのですが、実行すると400000行目以降(最初の構造体のMAX時点)がうまく読み込めません。 詳しい方がいましたら、ご教授願います。 #define MAX_SIZE 400000 char filename[] = ″test.txt"; struct ALL_DATA{ char cmd[10]; int addr; int bsize; }; for (int lp = 0; lp < 100; lp++){ FILE *fp; struct ALL_DATA ADATA[MAX_SIZE]; // 構造体配列の宣言 if (lp > 0){ fseek(fp, LP, SEEK_SET); } if ((fp = fopen(filename, "r")) == NULL){ printf("%s open error !\n", filename); exit(1); } for (fc = 0; fc < MAX_SIZE; fc++) { if (feof(fp)){ break; } else{ fscanf(fp, "%s %d %d\n", ADATA[fc].cmd, &ADATA[fc].addr, &ADATA[fc].bsize); } } LP = ftell(fp); //現在のFPの取得 printf("********** FP-> %ld *********\n", LP); fclose(fp); while (i < MAX_SIZE){ if (loopcnt == 0){ printf("ADATA[i].cmd -> %s, ADATA[i].addr -> %d, ADATA[i].bsize -> %s\n",ADATA[i].cmd, ADATA[i].addr, ADATA[i].bsize); // i++; } } 上記のような形で作成しています(一部抜粋)。 読み込むテキストデータは testA 123456 20 testA 23415 2 testB 12114567 678 のように「文字列 スペース 数字 スペース 数字」と並んでおり 値はランダムになっています。 初めて質問するため、わかりにくい記述があるかと思いますが、よろしくお願いします。

  • csvファイルのデータを構造体に

    csvファイルのカンマを数えて任意の文字列を抜き出すまでは出来たのですがそこから構造体に格納するまでがこちらのサイトでも検索しましたがよくわかりません。 ご指摘のほどよろしくお願いします。 csvデータ 番号,名前,住所,電話,年齢,性別 1,佐藤,東京,1234,33,A 2,田中,,5678,22, 3,坂井,名古屋,,,B ・ ・ 番号,住所,電話,年齢を格納する場合 struct k_data { char no[4];/* 出来れば番号を右詰めにしたい */ char add[20]; int tel; int age; } kaiin[256]; /* 文字列を抜き出す↓ */ int main(void) { FILE *fp1,*fp2; char dat[256]; char *ch; int cnt; /* fp1 ファイルオープン */ /* fp2 ファイルクローズ */ while (fgets(dat, 256, fp1) != NULL) { cnt = 0; for (ch = dat; *ch != '\0'; ch++) { if (*ch ==',') { if (cnt == 0) { putc(*ch, fp2); } if (cnt == 2) { putc(*ch, fp2); } if (cnt == 3) { putc(*ch, fp2); } if (cnt == 4) { putc('\n', fp2); } cnt++; } else { if (cnt == 0) { putc(*ch, fp2); } if (cnt == 2) { putc(*ch, fp2); } if (cnt == 3) { putc(*ch, fp2); } if (cnt == 4) { putc(*ch, fp2); } } } putc('\0', fp2); } fclose(fp2); fclose(fp1); }

  • ファイル読み込みが上手くできません

    C言語初心者です。 現在、ファイルの情報を構造体に読込んで実行するプログラムを作成しております。 読込むファイルは700MBほど(行数は39900000行)となっており、1行ずつfscanfで読込んでいます。 400000行ごとに構造体に読込んで、処理を実行し、構造体に読込んだ全ての処理が完了したら、再度400000行読込んで・・・を繰り返すものになっております。 400000行ごとにしているためforループで100回まわすようにしているのですが、最後の1回(100回目のループ)で、99回目と同じ場所を読んできてしまいます。 つまり、最後の1回だけはファイルポインタが進んでいない状況になります。 コードは下記になります。 #define MAX_SIZE 400000 uint64_t i = 0; uint64_t fc = 0; int main(int argc, char *argv[]){ char w[] = "$write"; char r[] = "$read"; // ファイルを構造体へ格納 char filename[] = "TEST_READ_WRITE.txt"; struct TEST_DATA{ char cmd[10]; int addr; int bsize; }; FILE *fp; if ((fp = fopen(filename, "r")) == NULL){ printf("%s open error !\n", filename); exit(1); } for (int lp = 0; lp < 100; lp++){ struct TEST_DATA TD[MAX_SIZE]; // 構造体配列の宣言 for (fc = 0; fc < MAX_SIZE; fc++) { if (feof(fp)){ break; } else{ fscanf(fp, "%s %d %d\n", TD[fc].cmd, &TD[fc].addr, &TD[fc].bsize); } } while (i < MAX_SIZE - 1){ //ファイルから取得したデータによって処理を実行 if (strcmp(TD[i].cmd, w) == 0){ //書込み処理 } if (strcmp(TD[i].cmd, r) == 0){ //読み込み処理 } } printf("Finish!! \n"); } fclose(fp); return 0; } 読込むファイルはテキストデータで、 $write 25651496 152 $write 135878112 8 $read 1244848 16 のような感じのものが39900000行並んでいるものになります(数字はランダムです)。 最後の1回のみ上手くファイルポインタが進まない原因が分からずに困っています。 お気づきの方がいらっしゃいましたら、アドバイスをよろしくお願いします。

  • CSVファイルの内容を構造体に格納したい(Unix使用)。

    こんにちは。私は30代の男性です。 「名前」「身長」「体重」が記載されたCSVファイルの内容を読み取って、構造体の「name」「height」「weight」に格納するプログラムを作っています。CSVの内容は A,175,80 B,167,89 C,155,45 ・ ・ ・ Z,188,70 だと仮定します。数値が読み取れているか、下記のように「tp = strtok(file_image, ",\n" );」の前後に「printf("%s\n", file_image);」を置いてみたら、strtok前では全て表示されるのに、strtok後では「ABC」しか表示されません。これでは全てのデータを構造体に格納できないので、困っています。 1.どのようにすれば、数字も取り出せる(読み取れる)でしょうか? 2.効率よく構造体に格納するには、どのようにしたらよいでしょうか? アドバイスを頂ければ幸いです。宜しくお願いいたします。 #include <stdio.h> #include <stdlib.h> #include <limits.h> #include <string.h> int main(int argc, char *argv[]) { FILE *fp = NULL; int rtn = 0; if ((fp = fopen(argv[1], "r")) == NULL) { printf("ファイルオープンに失敗しました。\n"); return 1; } if (argc != 2) { printf("ERROR: オプションの数に過不足があります。\n"); return 1; } rtn = change_csv(fp); return 0; } int change_csv(FILE *fp) { int i; int j; char file_image[256]; /* 読み込んだ先のメモリの領域 */ char *tp; for (i = 0; i <= 256; i++) { if (fgets(file_image, 256, fp) == NULL) { if (ferror(fp) != 0) { printf("ERROR: 読み込みに失敗しました。\n"); return 1; } } if (feof(fp) != 0) { break; } printf("%s\n", file_image); tp = strtok(file_image, ",\n" ); printf("%s\n", file_image); } fclose(fp); return 0; }

  • 構造体データの出力でデータが化けます

    /* テスト用データは半角英数字で書き、半角スペースで区切ってメモ帳で書きました   Elfe 1 1 100 10 10 10 10 10 5 3 0 1 goblin 1 1 100 10 10 10 10 10 5 3 0 1 Slime 1 1 100 10 10 10 10 10 5 3 0 1 Orc 1 1 100 10 10 10 10 10 5 3 0 1 実行して表示させてみたところ大きな数字に化けます。 Elfe 7665736 7665740 7665744 7665748 7665752 7665756 7665760 7665764 7665768 766 5772 7665776 7665780 15012128  7665912 7665916 7665920 7665924 7665928 7665932 7665936 7665940 7665944 766594 8 7665952 7665956 15012128 なにがいけないのでしょうか? よろしくお願いします。 */ #include <stdio.h> #include <stdlib.h> #define MAX 10 typedef struct{// 構造体の宣言 char name[128];//プレイヤーキャラの名前 1 int loading;//ダンジョン階 2 int lv;//レベル 3 int exp;//経験値 4 int hp;//ヒットポイント 5 int mp;//マジックポイント 6 int atk;//攻撃力 7 int def;//防御力 8 int agi;//敏捷力 9 int heal;//回復量 10 int dmg;//ダメージ 11 int y;//Y座標 12 int x;//X座標 13 }player; int main(void) { int i, cnt; FILE *fp; player pc[MAX]; // 構造体配列の宣言 if( (fp = fopen( "player.txt", "r" )) == NULL ) { printf( "ファイルがオープンできません\n" ); exit( 1 ); } for( i = 0; i < MAX; ++i ) { if( fscanf( fp, "%s %d %d %d %d %d %d %d %d %d %d %d %d %d\n" // 構造体配列への読み込み ,pc[i].name, &pc[i].loading, &pc[i].lv, &pc[i].exp, &pc[i].hp, &pc[i].mp, &pc[i].atk, &pc[i].def, &pc[i].agi, &pc[i].heal, &pc[i].dmg, &pc[i].y, &pc[i].x ) != 4) break; } fclose( fp ); cnt = 0; // これでテスト printf( "%s %d %d %d %d %d %d %d %d %d %d %d %d %d\n" ,pc[cnt].name, &pc[cnt].loading, &pc[cnt].lv, &pc[cnt].exp, &pc[cnt].hp, &pc[cnt].mp, &pc[cnt].atk, &pc[cnt].def, &pc[cnt].agi, &pc[cnt].heal, &pc[cnt].dmg, &pc[cnt].y, &pc[cnt].x); cnt = 1; printf( "%s %d %d %d %d %d %d %d %d %d %d %d %d %d\n" ,pc[cnt].name, &pc[cnt].loading, &pc[cnt].lv, &pc[cnt].exp, &pc[cnt].hp, &pc[cnt].mp, &pc[cnt].atk, &pc[cnt].def, &pc[cnt].agi, &pc[cnt].heal, &pc[cnt].dmg, &pc[cnt].y, &pc[cnt].x); return 0; }

  • cygwinを使ってcsvファイルを読み込み、出力させようとしています

    cygwinを使ってcsvファイルを読み込み、出力させようとしています。 とりあえず、読み込みのみのプログラムを作成し、 実行させてみたのですが(run ファイル名.csv と入力) 「Error: could not start C:\cygwin\home\ユーザー名ファイル名.csv」 と出力され、読み込みができず、困っています。 プログラム初心者です。 恐縮ですがご回答よろしくお願いします。 以下に、読み込みプログラムとcsvファイルを記載します。 (プログラムは拾い物です。) <プログラム> #include <stdio.h> #define MAX_ITEM_SIZE 100 #define MAX_LINE_SIZE 1024 char *GetCSVItem(char *wp, char *buff, int size); void main(int argc, char *argv[]) { FILE *fp; char buff[MAX_LINE_SIZE], *wp, item[3][MAX_ITEM_SIZE]; int i1, len; if(argc != 2){ printf("comand error nyuuryoku keishiki\n"); return; } fp = fopen(argv[1], "r"); if(fp == NULL){ printf("can not open file[%s].\n", argv[1]); return; } for(;;){ if(fgets(buff, MAX_LINE_SIZE, fp) == NULL) break; len = strlen(buff); if(len == 0 || buff[len-1] != '\n'){ if(feof(fp) == 0){ printf("data error[%s].\n", buff); return; } } buff[len-1] = '\0'; wp = buff; if((wp = GetCSVItem(wp, item[0], MAX_ITEM_SIZE)) == NULL){ printf("error(1)\n"); break; } if((wp = GetCSVItem(wp, item[1], MAX_ITEM_SIZE)) == NULL){ printf("error(2)\n"); break; } if((wp = GetCSVItem(wp, item[2], MAX_ITEM_SIZE)) == NULL){ printf("error(3)\n"); break; } if(*wp != '\0'){ printf("error(4)\n"); break; } for(i1 = 0; i1 < 3; i1++){ printf("%d:%s\n", i1+1, item[i1]); } } fclose(fp); } char *GetCSVItem(char *wp, char *buff, int size) { int i1; buff[0] = '\0'; while(*wp == ' ' || *wp == '\t') wp++; if(*wp == '\0'){ return(NULL); } for(i1 = 0; i1 < MAX_ITEM_SIZE; i1++, wp++){ if(i1 >= size) return(NULL); buff[i1] = *wp; if(*wp == '\0'){ buff[i1] = '\0'; return(wp); } if(*wp == ','){ wp++; buff[i1] = '\0'; break; } } return(wp); } <csvファイル> 1,2,3 11,12,13 21,22,23

  • fgetsを使ってcsvからcsvに

    csvファイルからfgetsを使い任意の文字列を取り出して新たなcsvファイルに出力したいのですがなかなかうまくいきません。ご指摘の方よろしくお願いします。 csvデータ 社名,住所,番号,設立年,従業員数,分類 山川商事,東京,123,8,60,証券 谷運輸,,578,20,400,運送 空海コンピュータ,,456,,300,ソフトウェア          ・          ・          ・ データの3,5,6番目を取り出したい。(データが入ってない箇所もある) #include <stdio.h> int main(void) { FILE *fp1,*fp2; char data[256]; char *data_p = data; int cnt = 0; char ch[256]; char *ch_p = ch; //ファイルオープン(fp1)// //ファイルクローズ(fp2)// while (fgets(data, 255, fp1) != NULL) { if (*data_p != ',') { if(cnt == 2) { *ch_p = *data_p; data_p++; ch_p++; } if (cnt == 4) { *ch_p = *data_p; data_p++; ch_p++; } if (cnt == 5) { *ch_p = *data_p; data_p++; ch_p++; } } else { if (cnt == 2) { *ch_p = *data_p; data_p++; ch_p++; } if (cnt == 4) { *ch_p = *data_p; data_p++; ch_p++; } if (cnt == 5) { *ch_p = *data_p; data_p++; ch_p++; } cnt++; x++; } } y = '\0'; fprintf(fp2, "%s", ch); fclose(fp1); fclose(fp2); }

  • ファイル読込時に構造体の文字列ポインタに割当てたいと

    ファイル読込時に構造体の文字列ポインタに割当てたいと思っています。 (new 演算子を使用します。) 文字列の長さが不定です。 どうすれば、文字列の長さを知ることができますか? 以下のようなところまでは作れましたが、 困っています。 void loaddata()のfscanf関数の部分です。 ほかにも関数の void outputdata() void deletedata() がありますが、長いので省略しました。 ********************************************************** #include<stdio.h> #include<string.h> class data { public: struct basic { char *name; int age; struct basic *next; }; private: struct basic *base; struct basic *base_top; int cnt; public: data::data() { cnt=0; } void inputdata(char *name,int age) { if(cnt==0) { base=new basic; base_top=base; base->age=age; int len=strlen(name); base->name=new char[len+1]; strcpy(base->name,name); cnt++; } else { base->next=new basic; base=base->next; base->age=age; int len=strlen(name); base->name=new char[len+1]; strcpy(base->name,name); cnt++; } } void savedata() { base=base_top; FILE *fp; fp=fopen("dat.txt","w"); for(int i=0;i<cnt;i++) { fprintf(fp,"%s\t%d\n",base->name,base->age); base=base->next; } fclose(fp); } void loaddata() { if(cnt!=0){deletedata();} cnt=0; FILE *fp; fp=fopen("dat.txt","r"); while(1) { fscanf(fp,"%s\t%d\n",base->name,base->age); } } };

  • 構造体の構造体 引数

    構造体の中の構造体の関数の引き渡し方法がわかりません。 下記ソースで試したのですが、うまくいきませんでした。 助言お願いいたします。 //repo.c #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> #define NUM 20 #define MAX 15 struct seiseki{ float shu[3]; }; struct seito{ char name[NUM]; int age; struct seiseki kekka; }; void input(struct seito *p); void s_input(struct seiseki *p); void ss_input(struct seiseki *data); int main(){ int i; struct seito data[2]; for(i=0;i<2;i++){ printf("------------------------------\n"); printf("%d人目",i+1); input(&data[i]); } printf("%f\n",data[0].kekka.shu[0]); printf("%f\n",data[0].kekka.shu[1]); printf("%f\n",data[0].kekka.shu[2]); //data[1]に格納できない。 printf("%f\n",data[1].kekka.shu[0]); printf("%f\n",data[1].kekka.shu[1]); printf("%f\n",data[1].kekka.shu[2]); return 0; } void input(struct seito *p){ printf("名前->"); scanf("%s",p->name); printf("年齢->"); scanf("%d",p->age); s_input(&(p->kekka)); } void s_input(struct seiseki *data){ printf("国語->"); ss_input(data); printf("算数->"); ss_input(data); printf("英語->"); ss_input(data); } //下記関数で成績をchar型で受け取り、数値化したい。 void ss_input(struct seiseki *data){ char p[100]; int i=0; static int o=0; scanf("%s",p); while( p[i] != '\0'){ if(isdigit(p[i])==0){ printf("再入力してください"); scanf("%s",p); } i++; } data->shu[o]=atof(p); printf("%f\n",data->shu[o]); o++; }

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

専門家に質問してみよう