我正在尝试从文件中读取数据并将数据存储在结构中。结构看起来像这样:
struct someData {
int number;
char *name;
};
文件中的数据可以是任何格式。现在我正试图以CSV格式阅读。数据始终是一个字符串,后跟一个整数。
some string data,100
another string,500
以下是代码的一部分,我正在尝试读取数据并将其放在结构中。
FILE *ifp;
char *mode = "r";
char *name;
int number;
ifp = fopen("myDataFile.txt", mode);
if (ifp == NULL) {
fprintf(stderr, "Can't open input file in.list!\n");
exit(1);
}
// read up to 100 characters up to a comma, then a decimal
while(fscanf(ifp, "%100[^,],%d\n", name, &number) != EOF){
// print out the data we got
printf("Data from file: %s %d", name, number);
struct someData *newData = (struct someData *) malloc(sizeof(struct someData));
newData->number = number;
newData->name = name;
printf("Name: %s Number: %d\n\n",newData->name, newData->number);
}
打印陈述给我以下
Data from file: some string d 100
Name: some string d Number: 100
Data from file: another stri Number: 500
Name: another stri Number 500
第二个名字被切断,实际上最终打印出几个奇怪的字符。我觉得我的fscanf在while循环中出了问题。我已经尝试了一些其他方法来获取数据,例如使用%s而不是%100,但没有任何工作。
答案 0 :(得分:1)
您需要将第二个 char *name;
更改为char name[101];
(而不是struct
中的那个。)
如果你改变了会更好:
while(fscanf(ifp, "%100[^,],%d\n", name, &number) != EOF){
到
while(fscanf(ifp, " %100[^,],%d", name, &number) == 2){
此:
\n
同样newData->name = name;
无法使用:您需要newData->name = strdup(name);
之类的内容。
另外,作为一种风格问题,我建议改变:
struct someData *newData = (struct someData *) malloc(sizeof(struct someData));
为:
struct someData *newData = malloc(sizeof *newData);
这将避免一些冗余,即“干”。
你永远不会保存newData
;我认为你打算将它添加到链表或其他类似的容器中。
此外,您最终还需要添加错误检查,但这超出了此问题的范围。
答案 1 :(得分:0)
您正在使用未初始化的指针节点。函数fscanf需要字符串一些缓冲区,而你不提供任何缓冲区。