You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 00:50:23