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

A 回答 (3件)

 dataの配列の領域を確保するのにfile_sizeを使うのはおかしいし、


ファイルをテキストで開いた場合、ftellが返すのは
"ファイルポインタの位置を示す何らかの数値"であって、
文字数やバイト数とは限らない。
    • good
    • 0

何をやりたいのかわからないが、こういうこと?



#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define FILE_NAME "view_001_McdlData.csv"
struct Data{
int DataNo;
int FrameNo;
int SampleNo;
char Digital;
double voltage;
double trigger;
double C;
double D;
};
main()
{
FILE *fp;
int n,i;
struct Data *dat;
if ((fp = fopen(FILE_NAME,"r")) == NULL) {
printf( "file open error\n" );
exit(EXIT_FAILURE);
}
//データの読み込み
n = -1;
dat = NULL;
do {
n++;
dat = realloc(dat,sizeof(struct Data) * (n + 1));
} while(fscanf(fp, "%d,%d,%d,%x,%lf,%lf,%lf,%lf",
&dat[n].DataNo,&dat[n].FrameNo,&dat[n].SampleNo,&dat[n].Digital,
&dat[n].voltage,&dat[n].trigger,&dat[n].C,&dat[n].D) != EOF);
fclose(fp);
for(i = 0;i < n;i++)
printf("%d %d %d %c %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);
}
    • good
    • 0

4列目って文字型だよね%sだから。


文字型のfscanfの%sには&dat[i].Digitaじゃなくdat[i].Digitalでは。
しかも文字列だから最低char Digital[2];じゃないと文字列+'\0'が格納できないでしょ。
一文字なら%c
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

今、見られている記事はコレ!

  • 基本情報技術者試験の言語ってどうやって選ぶ?

    SEを目指す場合、基本情報技術者試験を経て実務に就いた人も多いのではないでしょうか。教えて!gooにはSEを目指している質問者からこんな質問が寄せられました。 「基本情報技術者試験のC言語とJavaの違い?」 将...

  • 牛丼まで割り勘の彼と暮らせる!?

    付き合っている彼氏や彼女のお金の使い方を見ていて、相手の金銭感覚が理解できず結婚を躊躇してしまうという話をたまに聞くが、その真っ只中で悩んでいる女性が「教えて!goo」に「牛丼さえ割り勘の彼氏」といった...

  • 【ヨーグルトとハチミツで作る】篠原涼子特製 生姜焼き

    ご飯がすすむおかずの定番、生姜焼き。家庭によって、またお店によって、様々なレシピがある中、女優の篠原涼子さんの作る特製生姜焼きのレシピが非常に興味深い。テレビで披露されたことのあるこの作り方は、なんと...

  • ウエディングドレスはなぜ白なのか?

    挙式予定の花嫁にとって、結婚式の準備は大変なものだ。特に新婦にとってのドレス選びは選択と迷いの連続。そのドレスであるが、白無垢も含め、色は総じて「白」である。だが、なぜウエディングドレスをはじめとする...

  • ゲーム業界ダンナ観察日記:第59話「増えろ脂肪」

    ダンナ様のねむねむ。奥様のとぽすけ。ごく普通のふたりは、ごく普通の結婚をし、だらだらと夫婦生活を送っていました。でもただひとつ違っていたのは、ダンナ様はゲーム会社勤務だったのです。

おしトピ編集部からのゆる~い質問を出題中

お題をもっとみる

このQ&Aを見た人が検索しているワード


このカテゴリの人気Q&Aランキング

おすすめ情報

カテゴリ