C:将fgets()与文件一起使用

时间:2015-06-11 18:39:30

标签: c file fgets

晚上好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);

}

2 个答案:

答案 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);
  }