如何在C++中从输入文件读取所有整数到数组(跳过非整数)
问题解决:读取包含无效字符的文件中的所有整数
问题原因
当前代码里,inputFile >> numbers[count] 尝试读取整数时,遇到文件中的abc(非整数内容)会触发输入流的失败状态(failbit被置位),后续所有读取操作都会直接终止,因此20无法被读取。
解决方案
需要在读取失败时,处理掉无效内容并恢复输入流的正常状态,具体步骤:
- 当读取整数失败时,判断是否是格式错误导致的失败
- 清除流的失败标志位,让流恢复可操作状态
- 跳过当前无效字符(直到换行符或下一个可能的整数)
- 继续循环尝试读取整数
另外注意:原代码的main函数未声明argc和argv参数,会导致编译错误,需要修正为int main(int argc, char* argv[])。
修改后的完整代码
#include <iostream> #include <fstream> #include <limits> // 用于处理流的字符跳过逻辑 using namespace std; int main(int argc, char* argv[]) { // 修正main函数参数声明 const int ARRAY_SIZE = 1000; int numbers[ARRAY_SIZE], count = 0; double total = 0, average; ifstream inputFile; if(argc == 2){ inputFile.open(argv[1]); if (!inputFile.is_open()) { // 增加文件打开失败的判断 cout << "Failed to open file" << endl; return 1; } } else{ cout << "Invalid arguments" << endl; return 1; } while (count < ARRAY_SIZE) { if (inputFile >> numbers[count]) { // 读取成功,计数递增 count++; } else { // 读取失败,处理无效内容 if (inputFile.fail() && !inputFile.eof()) { // 清除流的错误标志位 inputFile.clear(); // 跳过当前行的所有无效字符,直到换行 inputFile.ignore(numeric_limits<streamsize>::max(), '\n'); } else { // 到达文件末尾或严重错误,退出循环 break; } } } inputFile.close(); // 后续统计逻辑示例 for(int i=0; i<count; i++){ total += numbers[i]; } if(count > 0){ average = total / count; cout << "Total: " << total << endl; cout << "Average: " << average << endl; } return 0; }
代码说明
inputFile.clear():清除流的错误标志位,让流可以继续执行读取操作inputFile.ignore(numeric_limits<streamsize>::max(), '\n'):跳过当前行内的所有无效字符,确保后续能读取到下一行的20- 新增文件打开失败判断,避免因文件不存在、权限不足等问题引发的异常
内容的提问来源于stack exchange,提问作者AK G
相关产品推荐
相关产品推荐

