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