我已经读取文件的程序,相应地显示它,但是当试图再次查看内容时,它们就消失了。
结构:
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。我理解其他一些代码可能并不完美,但是现在我只关心搞清楚这一点:)。
答案 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{
.
.
.
}
}