C++读取用户输入的文件名时提示无效文件错误如何解决
问题修复方案
一、文件打不开的核心原因及修复
- 工作目录不匹配
多数IDE默认运行程序的工作目录是项目根目录,而非.cpp源文件存放目录。你可以通过两种方式解决:- 将file.txt放到程序运行的工作目录下(可以在代码中加入
cout << std::filesystem::current_path() << endl;打印当前工作目录,需要引入<filesystem>头) - 输入文件的绝对路径,Windows下格式为
C:\\文件夹\\file.txt,Linux/macOS下格式为/home/用户名/file.txt
- 将file.txt放到程序运行的工作目录下(可以在代码中加入
- 文件流状态未重置
第一次打开文件失败后,inputStream的错误标志位会被置位,后续就算输入正确文件名调用open()也会直接失败。需要在每次打开文件前清空错误标志、关闭之前可能打开的流:// 放到每次inputStream.open()之前 inputStream.close(); inputStream.clear(); inputStream.open(fileName); - 空文件判断逻辑错误
你当前代码中判断的是用户输入的文件名字符串为空,而非文件内容为空。正确的空文件判断逻辑是打开文件后判断第一个字符是否为EOF:if (inputStream.peek() == EOF) { cout << "Error <" << fileName << "> has no data." << endl; isEmpty = true; }
二、其他逻辑错误修复
readIntFile函数未给输出参数length赋值,会导致后续printValues的断言直接崩溃,需要在函数末尾添加length = count;- 数组下标越界:当前代码用
count作为数组下标,count从1开始,最大值为20,会访问超出数组边界的地址,修改赋值逻辑为intArray[count-1] = fileInputValue; - 错误的
eof()判断:while(!x.eof())会导致最后一行内容多读一次,修改循环逻辑为while (x >> fileInputValue) - 循环变量未重置:每次处理新文件前需要把
length、isEmpty重置为初始值,避免用上一次处理的残留数据。
修正后核心代码片段
int main() { ifstream inputStream; const int size = SIZE; string fileName; char sentinel = 'y'; while (sentinel == 'y' || sentinel == 'Y') { // 每次循环重置变量 int length = 0; bool isEmpty = false; int intArray[size] = {0}; cout << "Please enter the name of the file: "; cin >> fileName; // 重置流状态 inputStream.close(); inputStream.clear(); inputStream.open(fileName); if (inputStream.bad() || inputStream.fail()) { cout << "Error, <" << fileName << "> is Invalid File Name." << endl; sentinel = getSentinel(); continue; } if (inputStream.peek() == EOF) { isEmpty = true; cout << "Error <" << fileName << "> has no data." << endl; inputStream.close(); sentinel = getSentinel(); continue; } readIntFile(inputStream, intArray, size, length); printValues(intArray, length); inputStream.close(); sentinel = getSentinel(); } return 0; } void readIntFile(ifstream& x, int intArray[], int size, int& length) { int count = 0; int fileInputValue = 0; while (x >> fileInputValue && count < SIZE) { intArray[count] = fileInputValue; count ++; } if (count == SIZE && x >> fileInputValue) { cout << "The file has more than <" << SIZE << "> values." << endl; } length = count; }
内容的提问来源于stack exchange,提问作者Ryan Shaw
相关产品推荐
相关产品推荐

