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

使用getw()读取文件遇问题:素数筛选程序读取结果异常

解决文件读取异常+素数筛选写入问题

先理清楚你当前的问题:

  • 你提到疑惑是否和getw()有关,但你的代码里根本没用到这个函数,所以这个疑虑可以直接排除啦。
  • 读取结果异常最核心的原因是没有检查文件是否成功打开:如果file1.txt不存在、路径错误或者没有读取权限,fopen会返回NULL,这时候fscanf操作空指针,行为就会变得不可控,输出自然和预期不符。

接下来我一步步给你修复问题,同时实现素数筛选并写入文件的完整功能:

第一步:先修复文件读取异常

在打开文件后立即加个判断,确保文件成功打开,避免后续的错误操作:

#include <stdio.h>
int main() {
 FILE *in_file;
 int numbers;
 // 新增:检查文件是否成功打开
 in_file = fopen("file1.txt", "r");
 if (in_file == NULL) {
     printf("无法打开输入文件!请检查文件是否存在或路径是否正确\n");
     return 1; // 异常退出程序
 }
 while ( fscanf(in_file, "%d", &numbers) == 1) {
     printf("%d\n", numbers);
 }
 fclose(in_file);
 return 0;
}

这样如果文件打不开,程序会直接给出提示,不会继续执行错误的读取操作。

第二步:添加素数判断函数

要筛选素数,需要一个辅助函数来判断一个数是否为素数。注意处理特殊情况:小于2的数不是素数,2是唯一的偶素数,奇数只需要检查到平方根即可提升效率:

#include <stdio.h>
#include <math.h> // 用到sqrt函数

// 判断是否为素数的函数
int is_prime(int num) {
    if (num < 2) return 0; // 小于2的数都不是素数
    if (num == 2) return 1; // 2是最小的素数
    if (num % 2 == 0) return 0; // 除了2,其他偶数都不是素数
    // 只检查从3到sqrt(num)的奇数
    for (int i = 3; i <= sqrt(num); i += 2) {
        if (num % i == 0) {
            return 0;
        }
    }
    return 1;
}

第三步:整合功能,将素数写入输出文件

现在把读取、筛选、写入功能整合起来,打开输出文件(比如命名为primes.txt),读取每个数字后判断是否为素数,是就写入输出文件:

#include <stdio.h>
#include <math.h>

int is_prime(int num) {
    if (num < 2) return 0;
    if (num == 2) return 1;
    if (num % 2 == 0) return 0;
    for (int i = 3; i <= sqrt(num); i += 2) {
        if (num % i == 0) {
            return 0;
        }
    }
    return 1;
}

int main() {
    FILE *in_file, *out_file;
    int numbers;

    // 打开输入文件并检查
    in_file = fopen("file1.txt", "r");
    if (in_file == NULL) {
        printf("无法打开输入文件file1.txt!\n");
        return 1;
    }

    // 打开输出文件(w模式会创建新文件,若已存在则覆盖)
    out_file = fopen("primes.txt", "w");
    if (out_file == NULL) {
        printf("无法打开输出文件primes.txt!\n");
        fclose(in_file); // 先关闭已打开的输入文件
        return 1;
    }

    // 读取数字、筛选素数并写入
    while (fscanf(in_file, "%d", &numbers) == 1) {
        if (is_prime(numbers)) {
            printf("找到素数:%d\n", numbers); // 控制台输出便于调试
            fprintf(out_file, "%d ", numbers); // 写入输出文件,用空格分隔
        }
    }

    // 关闭所有打开的文件
    fclose(in_file);
    fclose(out_file);
    printf("素数已成功写入primes.txt\n");
    return 0;
}

额外注意事项

  • 如果不想覆盖输出文件,可以用a模式(追加模式)打开,但一般素数筛选场景用w模式重新生成更合适。
  • 由于用到了sqrt函数,用gcc编译时需要链接数学库,命令为:gcc your_code.c -o prime_filter -lm。
  • 测试时确保file1.txt和程序在同一目录,或者写入完整文件路径(比如"/home/yourname/file1.txt")。

这样你的程序就能正常读取输入文件,筛选出素数并写入目标文件啦~

内容的提问来源于stack exchange,提问作者Maria

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:40:29