0

所以我有一个由整数组成的文件。我想使用 fscanf 将文件的整数读入链表。但是在编译期间,函数只是在那里等待输入(好像函数中的某处有一个 scanf )。请帮我 :(

代码

struct Node{
int data;
struct Node *next;
};

typedef struct Node Node;



void fillListFromFile(Node **head)
{
    FILE *f;
    if((f=fopen("/home/fileOints001.txt","r"))==NULL)
        printf("You cannot open");
    Node *newNode = malloc(sizeof(Node));
    while(fscanf(f, "%d", &(newNode->data)))
    {
    newNode->next = *head;
    *head = newNode;
    Node *newNode = malloc(sizeof(Node));

    }

}



fillListFromFile(&head); // in the main
4

2 回答 2

0

您的循环仅在无法转换输入时结束(即fscanf()在此处返回 0)。但是您不检查EOF. 因此,你转动你的轮子试图一遍又一遍地阅读。就像是:

int rc;

/* ... */

while ((rc = fscanf(...)) && rc != EOF) {
    /* ... */
}

这样你检查文件结束条件,并在你点击它时终止循环。

于 2012-04-20T14:41:45.057 回答
0

您需要进行一些错误检查以确保您的文件正确解析等。

此外,在成功读取数据之前不要分配节点可能是个好主意。

typedef struct Node {
    int data;
    struct Node *next;
} Node;

Node* fillListFromFile()
{
    FILE *f;
    if(!(f = fopen("/home/fileOints001.txt","r"))) {
        perror("/home/fileOints001.txt");
        abort();
    }

    Node *head = NULL, **tail = &head, *node;
    int n;
    while(1 == fscanf(f, "%d", &n)) {
        // allocate a new node
        node = malloc(sizeof(Node));
        if(!node) {
            fprintf(stderr, "failed to allocate memory");
            abort();
        }

        // and append it to the list
        node->data = n;
        node->next = NULL;
        *tail = node;
        tail = &node->next;
    }
    if(!feof(f)) {
            fprintf(stderr, "failed to parse the file");
            abort();
    }

    return head;
}
于 2012-04-20T15:08:27.850 回答