プロが教える店舗&オフィスのセキュリティ対策術

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で質問しましょう!