C 从文件读取数据并将其读入结构
我试图从文件中读入数据并将数据存储在结构中。结构如下所示:C 从文件读取数据并将其读入结构,c,C,我试图从文件中读入数据并将数据存储在结构中。结构如下所示: struct someData { int number; char *name; }; 文件中的数据可以是任何格式。现在我正在尝试以CSV格式阅读。数据将始终是后跟整数的字符串 some string data,100 another string,500 下面是我试图读取数据并将其放入结构的代码部分 FILE *ifp; char *mode = "r"; char *name; int number; ifp
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
第二个名字被剪掉,实际上最后打印了几个奇怪的字符。我认为while循环中的fscanf有问题。我尝试了其他几种获取数据的方法,例如使用%s而不是%100,但没有任何效果 您正在使用未初始化的指针节点。函数fscanf需要字符串缓冲区,您不提供任何缓冲区。您需要更改第二个
char*名称代码>到字符名[101]代码>(不是结构中的代码)
如果你改变一下,情况会更好:
while(fscanf(ifp, "%100[^,],%d\n", name, &number) != EOF){
到
这:
- 添加初始空白的skipover
- 删除尾部的
\n
,这有时会导致问题
- 验证是否已读取两个有效参数
同时newData->name=name代码>不起作用:你需要像newData->name=strdup(name)这样的东西代码>
此外,就风格而言,我建议改变:
struct someData *newData = (struct someData *) malloc(sizeof(struct someData));
致:
这将避免一些冗余,即“干燥”
而且您从不保存新数据
;我猜您计划将其添加到链接列表或其他类似容器中
此外,您最终需要添加错误检查,但这超出了本问题的范围。char*name代码>名称不指向数组。在fscanf之前,在中,如果这样做了!非常感谢。感谢您提供关于strdup()的提示,这是我的下一个问题。是的,在这之后它会进入一棵树。@JDD:只是澄清一点。您在fscanf
中的尾随\n
并不意味着“吃光新行”。这意味着“在遇到非空格字符或文件结尾之前,吃掉所有(零个或多个)空格字符”(%[…]
中的规则不同)。所以你的建议没有错,但我的建议总的来说比较安全。但是我的解决方案仍然存在一个潜在的问题,即name
具有尾随空格,这可能不是您想要的,并且可能会导致问题。您必须手动移除这些,或使用例如Trim
。此外,您可能需要使用%100[^,\n]
。
struct someData *newData = (struct someData *) malloc(sizeof(struct someData));
struct someData *newData = malloc(sizeof *newData);