C语言生成大量整数写入TXT文件异常:超49个整数失效求助
问题分析与解决
问题根源
你遇到的核心问题是用getw的返回值直接判断EOF是错误的。
getw读取二进制整数并返回int类型,而EOF是定义为-1的宏。当文件中存在某个随机整数的值恰好等于-1时,getw会返回-1,程序会误判为已读到文件末尾,提前终止读取循环。生成少量随机数时,碰巧没遇到值为-1的整数,程序正常;数量超过49后,概率上更容易碰到这个值,导致读取提前停止。
另外代码还有个小问题:输入提示写的是Enter -1 to exit,但实际循环条件是n != 0,会造成用户误解。
修复方案
提供两种可靠的解决方式:
方式1:先写入总数量,读取时按数量读取
这种方法最直观,能精准控制读取的整数个数:
#include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { FILE *fptr; int num, n; // 初始化随机数种子,避免每次生成相同序列 srand((unsigned int)time(NULL)); fptr = fopen("integers.txt", "wb"); if (fptr == NULL) { printf("Failed to create the file.\n"); return -1; } printf("File created successfully!\n"); printf("Enter the number of integers to generate (enter -1 to exit): "); scanf("%d", &n); if (n == -1) { fclose(fptr); return 0; } if (n <= 0) { printf("Invalid number, please enter a positive integer.\n"); fclose(fptr); return -1; } // 先写入要生成的整数总数 fwrite(&n, sizeof(int), 1, fptr); // 写入随机整数 for (int i = 0; i < n; i++) { num = rand(); fwrite(&num, sizeof(int), 1, fptr); } fclose(fptr); // 读取文件 fptr = fopen("integers.txt", "rb"); if (fptr == NULL) { printf("Failed to open the file.\n"); return -1; } // 先读取总数量 int total; fread(&total, sizeof(int), 1, fptr); printf("\nNumbers:\n"); int count = 0; for (int i = 0; i < total; i++) { fread(&num, sizeof(int), 1, fptr); printf("%d\n", num); count++; } printf("\nNumber of elements in the file: %d", count); fclose(fptr); return 0; }
方式2:用feof判断文件末尾
如果不想额外存储总数量,可以结合feof判断是否到达文件末尾:
#include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { FILE *fptr; int num, n; srand((unsigned int)time(NULL)); fptr = fopen("integers.txt", "wb"); if (fptr == NULL) { printf("Failed to create the file.\n"); return -1; } printf("File created successfully!\n"); printf("Enter the number of integers to generate (enter -1 to exit): "); scanf("%d", &n); if (n == -1) { fclose(fptr); return 0; } if (n <= 0) { printf("Invalid number, please enter a positive integer.\n"); fclose(fptr); return -1; } while (n != 0) { num = rand(); putw(num, fptr); n--; } fclose(fptr); fptr = fopen("integers.txt", "rb"); if (fptr == NULL) { printf("Failed to open the file.\n"); return -1; } printf("\nNumbers:\n"); int count = 0; // 先读取,再判断是否到文件末尾 while (1) { num = getw(fptr); if (feof(fptr)) break; printf("%d\n", num); count++; } printf("\nNumber of elements in the file: %d", count); fclose(fptr); return 0; }
额外优化说明
- 添加
srand((unsigned int)time(NULL))初始化随机数种子,避免每次运行生成完全相同的随机序列。 - 使用
wb/rb模式打开文件,明确二进制操作,避免不同平台下的换行符转换问题。 - 修正了输入提示与循环条件不一致的问题,让用户交互更清晰。
内容的提问来源于stack exchange,提问作者Magnus Bane
相关产品推荐
相关产品推荐

