C语言stream.valid()报错问题求助
问题分析与修复方案
你的代码存在几个关键问题,直接导致了stream.valid()错误,逐一拆解如下:
1. 未验证文件是否成功打开
fopen_s调用后没有检查返回值,也没确认Result指针是否有效。如果文件不存在、路径错误或无读取权限,Result会保持NULL,后续用空指针调用fgets必然触发stream.valid()错误。
2. 数组参数传递错误
你定义了double m[5], l[5],但直接把&m和&l传给sscanf_s是错误的——&m是指向整个数组的指针(类型为double (*)[5]),而sscanf_s需要的是单个double的指针(double*)。同时代码缺少索引变量,无法逐个填充数组,会引发内存越界和数据混乱。
3. 空指针调用fclose
如果文件打开失败,Result为NULL,此时调用fclose(Result)会触发未定义行为,加重错误。
修复后的代码
#include <stdio.h> #include <string.h> #include <math.h> #include <stdlib.h> const double g = 9.81; int main() { FILE* Result = NULL; double m[5], l[5]; char line[100]; int index = 0; // 数组索引,避免越界 // 检查文件是否成功打开 if (fopen_s(&Result, "Result.txt", "rt") != 0) { printf_s("无法打开文件Result.txt\n"); return 1; } // 限制数组索引不超过上限,避免越界 while (fgets(line, sizeof(line), Result) && index < 5) { // 跳过空行(兼容Windows的\r\n换行) if (line[0] == '\n' || line[0] == '\r') { continue; } // 传递数组单个元素的地址,并验证读取结果 if (sscanf_s(line, "m:%lf l:%lf", &m[index], &l[index]) == 2) { printf_s("m:%lf l:%lf\n", m[index], l[index]); index++; // 读取成功才移动索引 } else { printf_s("该行格式错误:%s\n", line); } } // 仅当文件指针有效时执行关闭操作 if (Result != NULL) { fclose(Result); } return 0; }
额外注意事项
- 确保
Result.txt与程序在同一目录,或使用完整文件路径(如"C:\\test\\Result.txt")。 - 文本文件每行格式必须严格匹配
m:数值 l:数值,否则sscanf_s会读取失败,可根据实际格式调整格式化字符串。 - 数组大小为5,读取时需限制索引不超过4,避免内存越界。
内容的提问来源于stack exchange,提问作者Code Bom
相关产品推荐
相关产品推荐

