• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:CSVファイルを読み込み構造体のメンバ、"value"に格納し、その後)

CSVファイルの読み込みと構造体への格納によるセグメンテーション違反の解決方法

このQ&Aのポイント
  • CSVファイルを読み込んで構造体のメンバ「value」に格納する際、セグメンテーション違反が発生してプログラムが終了してしまう問題が発生しています。
  • セグメンテーション違反の原因は、ファイルのサイズに合わせたメモリの確保や、ファイルの読み込み方法の不備が考えられます。
  • 解決方法としては、ファイルのサイズに合わせて適切なメモリを確保し、ファイルを一度に読み込むのではなく、1行ずつ読み込む方法を採用することが有効です。

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

  • ベストアンサー
回答No.2

おや、どこかで見覚えが・・・。 「for(i=0;i<file_size;i++){」ですが、fscanf()は1行読み込むところを file_size回(8倍)も余分に読んでいます。これではパソコンもたまったものではありませんよね。普通はファイルの終わりまで読むのが一般的です。  また、無理してカンマのCSVファイルにしなくてもカンマが使われていないのですから、普通のファイル名でよいのではないですか。 #include <stdio.h> #include <stdlib.h> #define SIZE 64 #define FILE_NAME_00 "f_00_01.CSV" struct Data{ double value; double ave; }; int main(void){ FILE* fp,*fo; // ファイルポインタ用 int n, i, file_size; struct Data *dat; if ((fp = fopen(FILE_NAME_00,"r")) == NULL) { printf( "file open error\n" ); exit(EXIT_FAILURE); } fseek(fp, 0, SEEK_END); file_size = ftell(fp); // double + double = 16バイト。 csv fileは1行8バイト。 dat = (struct Data*)malloc(2 * file_size); printf("malloc address= %p, file size= %d\n", dat, file_size); fseek(fp, 0, SEEK_SET); i = 0; while(fscanf(fp, "%lf", &dat[i].value) != EOF) { printf("%lf\n",dat[i++].value); } fclose(fp); free(dat); return 0; }

その他の回答 (1)

  • mk48a
  • ベストアンサー率56% (1133/2007)
回答No.1

読み込むファイルが別にCSV形式じゃないとかのつっこみは置いておいて、 >file_size = ftell(fp); ファイルの末尾のファイルポインタを配列の数にするのはちょっと違うと思う。 一回ファイルの改行数をカウントして配列数を取得するか、可変長の配列を使うのが妥当かと。 >dat = (struct Data*)malloc(file_size); やりたい処理だと以下のように修正 dat = (struct Data*)malloc(size_of(Data)*file_size); 多分、メモリ領域が足りていないでセグメンテーションエラーになっているはず。

関連するQ&A