CSVファイルを読み取るための私のCコードは次のとおりです。
#include <stdio.h>
struct record
{long a,b,c; };
int main(void)
{
const char filename[] = "b.csv";
FILE *file = fopen(filename, "r");
if ( file != NULL )
{
char line [ 80 ];
struct record record [ 50 ];
size_t count, i = 0;
while ( i < sizeof record / sizeof *record )
{
if ( fgets(line, sizeof line, file) == NULL )
{
break;
}
if ( sscanf(line, "%ld,%ld,%ld", &record[i].a,&record[i].b,&record[i].c) == 3 )
{
++i;
}
}
fclose(file);
for ( count = i, i = 0; i < count; ++i )
{
printf("record[%lu]: a = %ld b = %ld c = %ld\n",
(long unsigned)i, record[i].a, record[i].b,record[i].c);
}
}
else
{
perror(filename);
}
return 0;
}
/* ファイル.csv
301,36,15
302,88,75
//私の出力
record[0]: a = 301 b = 36 c = 15
record[1]: a = 302 b = 88 c = 75
*/
上記のコードには2つの問題があります..
第 1 号は次のとおりです: /* file.csv
301,,15
302,88,
,,,34
出力は
record[0]: a = 301 b = 0 c = 15
record[1]: a = 302 b = 88 c = 0
record[2]: a = 0 b = 0 c = 34
2 番目の問題は、「eof」までファイルを読み取る必要があることです。ここでは、静的な行番号の値として 50 を使用しています。どのような変更を加える必要がありますか?
この方法でコードを変更したことを確認してください...
const char* getfield(char* line, int num) {
const char* tok;
for (tok = strtok(line, ",");
tok && *tok;
tok = strtok(NULL, ",\n"))
{
if (!--num)
return tok;
}
return NULL;
}
int main()
{
FILE* stream = fopen("b.csv", "r");
char line[1024];
char *pstr;int num;
const char* value;
while (fgets(line, 1024, stream))
{
char* tmp = strdup(line);
//printf("Field 3 would be %s\n", getfield(tmp, 3));
value=getfield(tmp, 3);
num =strtol(value,&pstr,10);
printf("Field 3 would be %d\n", num);
// NOTE strtok clobbers tmp
free(tmp);
}
}