从文件和结构中读取数据

时间:2014-02-15 19:09:35

标签: 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 = 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,但没有任何工作。

2 个答案:

答案 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需要字符串一些缓冲区,而你不提供任何缓冲区。