C语言fscanf读取文件数据异常:菜单2无法显示文件内容
解决C语言图书管理系统查看数据功能跳过逻辑的问题
我帮你定位到问题啦!核心原因是你读取文件时用错了打开模式,导致程序根本读不到已保存的数据,直接跳过了显示逻辑。下面给你一步步拆解和修正:
1. 最关键的错误:文件打开模式不对
你的see_data函数里用了fopen("data-book.txt", "a")——"a"是追加模式,这个模式下文件指针会直接跳到文件末尾,所以fscanf从末尾开始读,自然读不到任何内容,循环直接终止,total被设为0,最后output_see也就没东西可显示。
修正方法:把打开模式改成只读模式"r",让文件指针从文件开头开始读取:
void see_data(Book* x, int* total) { FILE* file = fopen("data-book.txt", "r"); // 把"a"改成"r" if (file == NULL) { printf("No data found!!\n"); *total = 0; // 确保total被初始化,避免后续出错 return; } *total = 0; // 这里还要修正fscanf的格式:匹配你保存时的逗号分隔格式,同时支持带空格的书名/作者名 while(fscanf(file, "%[^,], %[^,], %[^,], %d\n", x[*total].titleBook, x[*total].authorBook, x[*total].categoryBook, &x[*total].codeBook) == 4) { (*total)++; } fclose(file); }
补充说明:原来的%s会读到空格就停止,如果你输入的书名带空格(比如"Harry Potter"),保存后读取会出错,用%[^,]可以读取到逗号为止的所有内容,完美匹配你保存时的格式。
2. 其他需要修正的小细节
scanf("%[^\n]s"里多余的s:在add和change函数中,scanf("%[^\n]s", ...)的s是冗余的,%[^\n]已经是完整的格式说明符,改成scanf("%[^\n]", ...)可以避免输入异常。- 初始化
jumlah变量:main函数里int menu_program, jumlah, limit = 0;中的jumlah没初始化,虽然see_data会重置它,但直接进菜单2时可能有随机值隐患,建议改成int menu_program, jumlah = 0, limit = 0;。 - case3的逻辑优化:菜单3修改数据时,建议先调用
see_data加载最新的文件数据,再修改,避免内存中的数据和文件不一致。
修正后的核心函数示例
比如修改后的add函数片段:
void add(Book x[],int total){ // add (1) for(int i = 0; i < total; i++){ fflush(stdin); printf("Masukan Judul Buku ke-%d: ", i + 1); scanf("%[^\n]", x[i].titleBook); // 去掉多余的s fflush(stdin); printf("Masukan Penulis Buku: "); scanf("%[^\n]", x[i].authorBook); // 去掉多余的s fflush(stdin); printf("Masukan Kategori Buku: "); scanf("%[^\n]", x[i].categoryBook); // 去掉多余的s fflush(stdin); printf("Masukan Kode Buku: "); scanf("%d", &x[i].codeBook); } }
测试步骤
修改完后,先通过菜单1添加几本图书(数据会正确保存到data-book.txt),再选择菜单2,就能正常读取并显示所有已保存的图书数据啦!
内容的提问来源于stack exchange,提问作者Raihan Firdaus
相关产品推荐
相关产品推荐

