我正在C中创建一个GIF生成器程序。作为文件管理的一部分,我将.txt文件加载到链接列表中。我想使用fgets逐行加载,但由于某种原因,我的程序进入了无限循环。这是我写的代码:
/*
Use: create a linked list from the .csv files and return it's head
Input: None
Output: head
*/
FrameNode* loadProject()
{
FrameNode* head = NULL;
FrameNode* curr = NULL;
FrameNode* newNode = NULL;
FILE* project = NULL;
char* path = NULL;
char line[BUFF_SIZE] = { 0 };
printf("Enter the path of the project (including project name):n");
path = myFgets();
project = fopen(path, "r");
if (project)
{
// create the list head
fgets(line, BUFF_SIZE, project);
head = loadNode(line);
curr = head;
while (fgets(line, BUFF_SIZE, project) != EOF)
{
// connect new node to the list
newNode = loadNode(line);
curr->next = newNode;
// update current node to be the new one
curr = newNode;
}
fclose(project);
}
else
{
printf("Error! canot open project, Creating a new projectn");
}
free(path);
return head;
}
如果有人了解无限循环的原因,请在下方回答
行
while (fgets(line, BUFF_SIZE, project) != EOF)
是错误的。
fgets()
在成功时返回作为第一个参数传递的指针,在失败时返回NULL
。它不会返回EOF
。
线路应为:
while (fgets(line, BUFF_SIZE, project))
或
while (fgets(line, BUFF_SIZE, project) != NULL)
如果遇到文件结尾并且没有读取任何字符,则fgets()
返回空指针,而不是EOF。因此,如果检查!= EOF
,则永远不会退出循环。