C将存档的行转换为数组

我有一个存档,我想把每一行变成一个数组:v [i] .data。 但是,当我运行代码时,它会为数组显示零。 有什么我应该改变的吗?

输入

1760
2月20日/ 18,11403.7
2月19日/ 18,11225.3
2月18日/ 18,10551.8
2月17日/ 18,11112.7
2月16日/ 18,10233.9

实际产出

1761
0

预期产出

1761
2月20日/ 18,11403.7

#include  #include  #include  #include  typedef struct{ char data[20]; }vetor; int main(int argc,char *argv[]){ FILE *csv; if((csv=fopen(argv[1], "r")) == NULL ) { printf("not found csv\n"); exit(1); } long int a=0; char linha[256]; char *token = NULL; if(fgets(linha, sizeof(linha), csv)) //counting lines { token = strtok(linha, "\n"); a =(1 + atoi(token)); } printf("%d\n", a); rewind(csv); vetor *v; v=(vetor*)malloc(a*sizeof(vetor)); char linha2[256]; while (fgets(linha2, sizeof(linha2), csv) != 0) { fseek(csv, +1, SEEK_CUR); for(int i=0;i<a;i++) { fscanf(csv, "%[^\n]", v[i].data); } } printf("%s\n", v[0].data); fclose(csv); return 0; } 

出现了一些错误,所以我继续用问题解释我所做的事情来重写问题区域

 #include  #include  #include  typedef struct{ char data[20]; }vetor; int main(int argc,char *argv[]){ FILE *csv; if((csv=fopen(argv[1], "r")) == NULL ) { printf("not found csv\n"); exit(1); } char line[20]; // Read number of lines int num_lines = 0; if (!fgets(line, sizeof(line), csv)) { printf("Cannot read line\n"); exit(1); } char* token = strtok(line, "\n"); num_lines = atoi(token) + 1; vetor* v = malloc(num_lines * sizeof(vetor)); // Fill in vetor int i = 0; while (fgets(line, sizeof(line), csv) != NULL) { int len = strlen(line); line[len-1] = '\0'; // replace newline with string terminator strcpy(v[i].data, line); //copy line into v[i].data i++; } printf("%d\n", num_lines); for (i = 0; i < num_lines; i++) { printf("%s\n", v[i].data); } return 0; } 

我认为主要的错误是误解了如何最好地阅读每一行信息。 如果我理解正确,你希望每个02/20/18,11403.7线都是02/20/18,11403.7数组中的一个元素。

最简单的方法是使用fgets一次只获取一行

 while (fgets(line, sizeof(line), csv) != NULL) 

将结束字符从换行符更改为终止字符'\0'的字符串

 int len = strlen(line); line[len-1] = '\0'; 

然后将字符串复制到vetor的第i个元素中并更新i以进行循环的下一次迭代。

 strcpy(v[i].data, line); i++;