我有一个包含信息的 csv 文件,其中的各个部分用“,”分隔。我想做的是获取此信息并将其存储在不同的结构变量中,但我不知道如何制作以便将信息存储在那里。
这是我的主文件:
struct items beer [100];
int main(int argc, char **argv) {
char *oneline, *tok;
char envara[512];
char delim [] = ",";
FILE *fp;
int i = 0;
fp = fopen("varor.csv", "r");
printf("ID\n");
while (!feof(fp)) {
if (fp == NULL) {
fprintf(stderr, "File varor.csv could not be opened\n");
exit(-1);
}
fgets(envara, 512, fp);
envara[strlen(envara) -1] = '\0';
printf("En rad; %s\n", envara);
oneline = strdup(envara);
tok = strtok(oneline, delim);
while (tok != NULL) {
printf("%s\n", tok);
tok = strtok(NULL,delim);
}
}
return 0;
}
这是我的结构:
struct items {
int itemnumber;
char name [100];
float price;
float volyme;
char types [100];
char style [100];
char package [20];
char country [20];
char producer [50];
float alcohol_amount;
};
最佳答案
逐行读取文件应该使用 fgets
来完成.如果您读取的流位于文件末尾,它将返回一个空指针。使用 feof
是 wrong .
尽管标记读取行有时是一种更好的方法,但您可以使用 sscanf
也可以将每一行的数据提取到您的 struct items
中。为了使我的示例更易于阅读,我更改了 struct items
如下:
typedef struct item_t {
char name[20];
float weight;
unsigned long id;
float price;
} Item;
如果您的 CSV 文件中没有标题行,您可以像这样简单地解析它:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_ITEM 5
typedef struct item_t {
char name[20];
float weight;
unsigned long id;
float price;
} Item;
int main() {
Item items[MAX_ITEM];
int i = 0, parsedData;
char line[512];
FILE* csvFile = fopen("test.csv", "r");
if(csvFile == NULL) {
perror("Failed to open file.");
exit(EXIT_FAILURE);
}
while(fgets(line, sizeof(line), csvFile) != NULL && i < MAX_ITEM) {
parsedData = sscanf(line, "%20[^,],%f,%lu,%f",
items[i].name, &items[i].weight, &items[i].id, &items[i].price);
if(parsedData == 4)
items[i++].name[19] = '\0';
else
fprintf(stderr, "Format error in line: %s\n", line);
}
fclose(csvFile);
return 0;
}
在我的示例中,第一个值也可以包含空格,格式字符串的 %20[^,]
部分表示:读取任何不是逗号的字符,最多 20 个字符。
注意:使用sscanf
函数并不安全,它会在很多方面导致溢出和未定义的行为。因此,您有责任使格式字符串能够解析 CSV 文件的字段,并使 sscanf
函数的参数列表保持正确。如果在第一个逗号之前包含超过 20 个字符,我的示例将跳过当前行,但是例如如果为 id
指定的数字太长,则无法防止整数溢出。要编写更安全的代码,请考虑通过适当的输入检查为每个不同的字段编写自己的转换函数,然后使用例如使用这些函数对行进行标记化以填充您的 struct items
。
关于C:将数据值读入结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48023977/