晚上好StackOverFlow。 我输入了一个使用列表和文件来管理地址簿的代码,现在我遇到了函数fgets()的问题。 在 print_file()过程中,我使用fgets()从文件中读取一行,并将其存储为最多200个字符的字符串。调试我的代码,我注意到该文件已经普及但在我用fgets()提取行以将其存储到字符串中后,字符串结果为空。下面我发布了程序 print_file()和程序 filling(),它将文件与列表的节点一起推广。有人可以帮帮我吗?
void print_file(FILE* myfile, int num){
char contact[200];
int i=0;
while(i<num){
fgets(contact, 200, myfile);
i++;
printf("%d) %s", i, contact);
}
fclose(myfile);
}
void filling(FILE* myfile){
list_struct* l; node_struct* new_node;
node_struct* tempnode;
t_contact temp;
int n_contacts=0, i=0;
printf("\n*****The file will be filled by a list*****\n");
l=made_list(); //creating new list
if(l!=NULL){
printf("\nList successfully created\n");
}
printf("How many contacts do you want to add to the list? ");
scanf("%d", &n_contacts);
for(i=1;i<=n_contacts;i++){
printf("NAME > ");
scanf("%s", temp.name);
printf("SURNAME > ");
scanf("%s", temp.surname);
printf("TELEPHONE > ");
scanf("%s", temp.telephone);
printf("E-MAIL > ");
scanf("%s", temp.email);
printf("\n");
new_node = made_node(temp); //creating new node
add_node(l, new_node);
}// end for --> the list has been popularized
tempnode = l->head;
while(tempnode!=NULL){
fprintf(myfile, "%s %s %s %s\n", tempnode->content.name, tempnode->content.surname, tempnode->content.telephone, tempnode->content.email);
tempnode=tempnode->next;
}
print_file(myfile, n_contacts);
fclose(myfile);
}
答案 0 :(得分:0)
你编写它的方式,fgets()将被调用从文件结尾开始读取。您可以使用fseek()定位到文件的开头。
答案 1 :(得分:0)
您需要在文件开头重新定位文件指针才能从中读取。正如你现在所知,当你调用print_file时它就在文件的末尾。
rewind(fp)
应该这样做。
根据你的评论我会建议这样的事情
另请注意,您在fclose()
内一次调用print_file
两次
在你致电print_file
之后的另一次,这绝对不是好事。而是从fclose
函数中删除print_file
,因为名称暗示它只打印。
/*
* extracts a row from the file and then puts it into
* a string and prints the result
* @param[in] myFile file pointer to file opened in rw access
* @param[in] num number of rows in the file
*/
void print_file(FILE* myfile, int num)
{
char contact[200]; // allocate on stack
int i = 0;
if ( myfile != NULL ) // check argument to function
{
fflush(myfile);
rewind(myfile);
for (i = 0; i < num; ++i)
{
if (fgets(contact, sizeof(contact), myfile) != NULL);
{
printf("%d) %s", i + 1, contact);
}
}
}
}
或者你可以通过阅读每一行而不关心num
来阅读从文件开头到文件结尾:
int i = 1;
while (fgets(contact, sizeof(contact), myfile) != NULL);
{
printf("%d) %s", i++, contact);
}