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);