使用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
相关产品推荐
相关产品推荐

