我正在学习 C 编程,但被一段代码困住了。我想读取并存储大约 10000 行和 5 列的大型 CSV 文件,每列的名称为 time、time_diff、SN、RS、Fr。
我为它编写了代码。由于我想读取不同的列,因此我使用 strtok 函数从一行中读取并存储在不同的变量中。我可以读取该文件并在屏幕上打印其内容。但我不知道如何将内容存储在数组中。
我尝试创建一个结构数组,然后将值存储在这些数组中,但不知何故它不起作用。我使用了 int 变量 i 的一些随机值,只是为了检查它是否有效。
有人可以解释一下如何将这些不同的变量存储在数组中以及如何回调它们。就像如果我想打印SN[1000],那么我该如何存储它。 以下是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFFER_SIZE 1024*1024
struct Filedata {
char *time;
int time_diff;
int SN;
int RS;
int Fr;
};
struct Filedata Data[10000];
int main ()
{
//char buffer [BUFFER_SIZE];
char *buffer;
FILE *fp;
char *token;
int filesize;
int i;
if ((fp=fopen("testfile.csv", "r"))==NULL)
{
printf ("file cannot be opened");
}
buffer = (char*)malloc (BUFFER_SIZE);
if (buffer == 0)
{
printf("Error: Out of Memory");
return 1;
}
fgets(buffer, BUFFER_SIZE, fp);
token = strtok(buffer, ";");
while (token !=NULL)
{
printf (" \t%s", token);
token = strtok (NULL, ";");
}
for (i=0; i<4;i++)
{
while ((fgets(buffer, filesize, fp)))
{
token = strtok(buffer, ";");
Data[i].time = token;
token = strtok(NULL, ";");
Data[i].time_diff = token;
token = strtok(NULL, "; ");
Data[i].SN = atoi(token);
token = strtok(NULL, "; ");
Data[i].RS = atoi(token);
token = strtok(NULL, "; ");
Data[i].Fr = atoi(token);
printf("\t%s\t%s\t%d\t%d\t%d\t\n", Data[i].time, Data[i].time_diff, Data[i].SN, Data[i]. RS, Data[i]. Fr);
}
}
free (buffer);
return 0;
}
预先感谢您的帮助
最佳答案
您的代码有几个问题。请在下面找到更正的版本。
您遇到的一些问题:
未在
Filedata.time
中正确保存strtok
的结果。您需要复制字符串,而不是使用赋值。因此,您需要使用malloc
为Filedata.time
分配空间(不要忘记free
每个Filedata.time
> 在这种情况下您分配的)并在那里复制strtok
的结果;或者,如果您愿意,也可以使用固定长度的字符串。在
Data[i].time_diff
的最后一个printf
中使用了错误的格式说明符。不使用
atoi
作为time_diff
。使用未初始化的变量。您使用了
filesize
变量,但没有对其进行初始化。struct Filedata { char *time; /*increase if you like or use dynamic memory*/ int time_diff; int SN; int RS; int Fr; }; struct Filedata Data[ARR_SIZE]; int main(int argc, char *argv[]) { char *buffer; FILE *fp; char *token; int filesize = 0; int i = 0, j=0; if ((fp=fopen("C:\\test.txt", "r"))==NULL) { printf ("file cannot be opened"); return 1; } buffer = malloc (BUFFER_SIZE); if (buffer == NULL) { printf("Error: Out of Memory"); return 1; } fgets(buffer, BUFFER_SIZE, fp); token = strtok(buffer, ";"); while (token !=NULL) { printf (" \t%s", token); token = strtok (NULL, ";"); } while ((fgets(buffer, BUFFER_SIZE, fp))) { if(i>=ARR_SIZE) break; Data[i].time=malloc(256); // Use constant(or define) which is more suitable for you token = strtok(buffer, ";"); strcpy(Data[i].time,token); token = strtok(NULL, ";"); Data[i].time_diff = atoi(token); token = strtok(NULL, "; "); Data[i].SN = atoi(token); token = strtok(NULL, "; "); Data[i].RS = atoi(token); token = strtok(NULL, "; "); Data[i].Fr = atoi(token); printf("\t%s\t%d\t%d\t%d\t%d\t \n", Data[i].time, Data[i].time_diff, Data[i].SN, Data[i].RS, Data[i].Fr); i++; } // Note: Also don't forget to free each Data[i].time for // which you allocated space, e.g. for(j =0;j<i; j++) free(Data[j].time); free(buffer); return 0; }
关于c - 读取一个大的CSV文件并用C语言存储内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31118576/