2

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

结构:

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 语句:

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

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

If 语句允许用户选择查看通讯录的联系人。

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

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

PS我知道其他一些代码可能并不完美,但现在我只是担心弄清楚这一点:)。

4

3 回答 3

2

file2函数将文件的每一行读入friends[i]但从不递增i。所以每条新记录都会覆盖前一条……除了函数在循环的第一次迭代期间返回。ifwhile在这种情况下使用更好。

其他建议:

而不是使用}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);
于 2012-11-17T20:30:14.703 回答
1

您必须再次将文件指针重置fseek到文件的开头。您的读取功能应该像这样开始:

fseek(read, 0, SEEK_SET); // set file pointer to the beginning of the file
于 2012-11-17T20:26:23.027 回答
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{
       .
       .
       .
    }
}
于 2012-11-17T20:40:47.193 回答