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

ファイルが正しく解析されることなどを確認するために、いくつかのエラーチェックが必要です。

また、データが正常に読み取られるまでノードを割り当てないことをお勧めします。

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 に答える
0

ループは、入力の変換に失敗した場合にのみ終了します (つまり、fscanf()ここでは 0 が返されます)。しかし、あなたはチェックしませんEOF。したがって、何度も何度も読み込もうとして車輪を回転させます。何かのようなもの:

int rc;

/* ... */

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

このようにして、ファイルの終わりの状態をチェックし、ヒットしたときにループを終了します。

于 2012-04-20T14:41:45.057 に答える