缓冲输出缺少名字

时间:2013-04-13 19:30:08

标签: c file memory-management structure

嗨我有这个问题,将数据读入结构数组 这就是我到目前为止所做的:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_NAME   20
#define FILE_NAME  50
#define LIST_SIZE 50
//void getData(RECORD name[], RECORD score)


typedef struct 
{
    char *name;
    int  score;
}RECORD;


int main (void)
{
    // Declarations
       FILE *fp;
       char fileName[FILE_NAME];
       RECORD list[LIST_SIZE];
       char buffer[50];
       int count = 0;
    // Statements
       printf("Enter the file name: ");
       gets(fileName);

       fp = fopen(fileName, "r");

       if(fp == NULL)
           printf("Error cannot open the file!\n");
       while (fgets(buffer, LIST_SIZE, fp) != NULL)
         {   
                     printf("%s\n", buffer);
         list[count].name = (char*) calloc(strlen(buffer), sizeof(char));
         sscanf(buffer,"%s%d", list[count].name, &list[count].score);
         printf("name is: %s and score is:%d \n", list[count].name, list[count].score);
         count++;

         }
       printf("Read in %d data records\n", count);
       return 0;
}

所以,在while循环中,当我尝试打印输出分配名称时似乎工作正常,但在我为名称分配内存后,缓冲区在打印时缺少名字。 所以我有这个输出

Enter the file name: in.txt
Ada Lovelace, 66

Torvalds, 75

Norton, 82

Thompson, 82

Wozniak, 79

Andreessen, 60

Knuth, 60

Goldberg, 71

Hopper, 82

Joy, 91

Tanenbaum, 71

Kernighan, 72
Read in 12 data records

而不是正确的输出

Enter the file name: in.txt
Ada Lovelace, 66

Linus Torvalds, 75

Peter Norton, 82

Ken Thompson, 82

Steve Wozniak, 79

Marc Andreessen, 60

Donald Knuth, 60

Adele Goldberg, 71

Grace Hopper, 82

Bill Joy, 91

Andrew Tanenbaum, 71

Brian Kernighan, 72
Read in 12 data records

这是我注释掉fscanf行之后的输出,所以我认为那里可能会出现错误。内存分配过程中有什么问题,我认为我做错了。

我现在修复了fscanf语句

Enter the file name: in.txt
Ada Lovelace, 66

name is: Ada and score is:3929744
Linus Torvalds, 75

name is: Linus and score is:3929752
Peter Norton, 82

name is: Peter and score is:3929760
Ken Thompson, 82

name is: Ken and score is:3929768
Steve Wozniak, 79

name is: Steve and score is:3929776
Marc Andreessen, 60

name is: Marc and score is:3929784
Donald Knuth, 60

name is: Donald and score is:3929792
Adele Goldberg, 71

name is: Adele and score is:3929800
Grace Hopper, 82

name is: Grace and score is:3929808
Bill Joy, 91

name is: Bill and score is:3929816
Andrew Tanenbaum, 71

name is: Andrew and score is:3929824
Brian Kernighan, 72
name is: Brian and score is:3929832
Read in 12 data records

你可以看到行名是:只打印出名字而不是姓氏和整数分数的地址。

3 个答案:

答案 0 :(得分:2)

fgets和fscanf互相争斗,因为他们都是从文件中读取的。使用fgets从文件中读取缓冲区,然后使用sscanf将数据解析为结构。

一般来说,你应该更喜欢fgets到fscanf因为它更安全。无论如何,不​​要混合使用fgets和fscanf。

答案 1 :(得分:0)

您的代码存在一些问题。首先,如果输入文件中存在某种模式,请尝试使用scanf和fscanf。使用fgets和gets时,我遇到了换行符问题。此外fscanf读取,直到找到空格字符或换行符(您是否在代码中考虑过这一点?因为很明显为什么它只读取其中一个名称段)。可能是您使用的printf具有相同的问题,它只会写入\ n或''。 如果你可以使用C ++,你可能想考虑使用ifstream和sstream。

答案 2 :(得分:0)

试试这个:

...

while (fgets(buffer, LIST_SIZE, fp) != NULL)
{
    char *tok;
    printf("%s\n", buffer);

    tok = strchr(buffer, ',');
    if (!tok)
    {
        printf("Bad line\n");
        continue;
    }

    list[count].name = strndup(buffer, tok - buffer);
    list[count].score = atoi(tok + 1);

    printf("name is: %s and score is:%d \n", list[count].name, list[count].score);
    count++;
}
...
相关问题