将文件读入C程序

时间:2012-11-17 20:17:31

标签: c struct

我已经读取文件的程序,相应地显示它,但是当试图再次查看内容时,它们就消失了。

结构:

typedef struct friends_contact {
    char *First_Name;
    char *Last_Name;
    char *home;
    char *cell;
} fr;

主:

int main() {
    fr friends[5];
    char buffer[BUFFSIZE];
    int counter = 0;
    int i = 0;

    menu(friends, &counter, i, buffer);

    getch();
    return 0;
} 

如果用于打开文件的菜单功能中的语句:

if (user_entry1 == 1) {
  printf("Please enter a file name");
  scanf("%s", user_entry3); 

  read = fopen(user_entry3, "r");
}

如果声明允许用户选择查看地址簿的联系人。

if (user_entry == 4 ) {
  print_contact(friends, counter, i, user_entry3);
  if (user_entry1 == 1) {
    file2(friends, counter, i, buffer, read);
  }
} 

阅读功能:

char file2(fr *friends, int *counter, int i, char buffer[], FILE *read) {
  while (fscanf(read, "%s", buffer) != EOF) {
    friends[i].First_Name = malloc(BUFFSIZE * strlen(buffer));
    strcpy(friends[i].First_Name, buffer);
    return printf("\n""%s ", friends[i].First_Name);       
  }  
  fclose(read);
}

如果您需要我提供更多代码。我试图让它将文件中的内容读入联系人列表,以便查看,搜索或删除它们。

P.S。我理解其他一些代码可能并不完美,但是现在我只关心搞清楚这一点:)。

3 个答案:

答案 0 :(得分:2)

file2函数将文件的每一行读取到friends[i]但从不递增i。因此每个新记录都会覆盖前一个记录...除了函数在循环的第一次迭代期间返回。在这种情况下,最好使用if而不是while

其他建议:

您可以使用}else;关闭if块,而不是使用}if不需要跟else

而不是成语

if (foo == 1) {
  // do stuff
} else if (foo == 2) {
  // do other stuff
} else {
  // do default stuff
}

你可以使用

switch (foo)  {
case 1:
  // do stuff
  break;
case 2:
  // do other stuff
  break;
default:
  // do default stuff
}

而不是

printf("\n""%s ",friends[i].First_Name);

使用单个字符串更常见,最后一行是换行符:

printf("%s\n", friends[i].First_Name);

答案 1 :(得分:1)

您必须再次使用fseek将文件指针重置到文件的开头。您的读取功能应该如下所示:

fseek(read, 0, SEEK_SET); // set file pointer to the beginning of the file

答案 2 :(得分:0)

您不应该忘记测试文件是否可以打开:

if ( user_entry1==1 ){

    printf( "Please enter a file name" );
    scanf( "%s", user_entry3 ); 

    if ( ( read = fopen( user_entry3, "r" ) ) != NULL ){
        printf( "The file couldn't be opened" );
    }
    else{
       .
       .
       .
    }
}