如何将文件fscanf到链表?

时间:2012-04-20 14:37:32

标签: c

所以我有一个由整数组成的文件。我想使用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

2 个答案:

答案 0 :(得分:0)

只有当转换无法转换输入时,您的循环才会结束(即fscanf()将在此处返回0)。但是你不检查EOF。因此,你旋转你的车轮试图反复阅读。类似的东西:

int rc;

/* ... */

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

通过这种方式,您可以检查文件结束条件,并在点击它时终止循环。

答案 1 :(得分: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;
}