C++获取用户输入文件名后读取对应文本文件出错求助
现有代码问题说明
你当前的代码存在以下几处错误导致运行结果不符合预期:
- 缺少必要的头文件引入与标准命名空间声明,代码无法直接编译
- C++11之前的标准中,
ifstream::open不直接接收std::string类型参数,需要转换为C风格字符串 - 循环逻辑错误:先判断流状态再执行读操作,会导致文件末尾多输出一次空行
- 输出时追加空格而非换行符,导致所有行内容被拼接为一行,和原文件格式不符
- 缺少文件打开失败的异常处理分支,出错时无任何提示
可直接运行的修复方案
以下代码经过验证,输入myfile.txt后会输出和原文件完全一致的内容:
#include <iostream> #include <fstream> #include <string> using namespace std; int main() { ifstream myfile; string myline, filename; cin >> filename; // 兼容新旧C++标准,传入C风格字符串 myfile.open(filename.c_str()); if (myfile.is_open()) { // 读取成功才进入循环,避免末尾多输出空内容 while (getline(myfile, myline)) { // 输出每行后添加换行符,匹配原文件格式 cout << myline << '\n'; } myfile.close(); } else { cout << "无法打开指定文件,请检查文件名与路径是否正确" << endl; } return 0; }
其他可选实现方式
实现1:C++11及以上版本简化写法
C++11开始支持ifstream构造函数直接传入std::string类型的文件名,代码更简洁:
#include <iostream> #include <fstream> #include <string> int main() { std::string filename; std::cin >> filename; std::ifstream myfile(filename); std::string line; if (myfile.is_open()) { while (std::getline(myfile, line)) { std::cout << line << '\n'; } } else { std::cerr << "文件打开失败\n"; } return 0; }
实现2:小文件场景一次性读取方案
对于体积较小的文件,可以直接读取全部内容到缓冲区,效率更高,且完全保留原文件的格式:
#include <iostream> #include <fstream> #include <string> #include <sstream> int main() { std::string filename; std::cin >> filename; std::ifstream myfile(filename); if (myfile.is_open()) { std::stringstream buffer; buffer << myfile.rdbuf(); std::cout << buffer.str(); } else { std::cerr << "文件打开失败\n"; } return 0; }
内容的提问来源于stack exchange,提问作者Arsalan Firoz
相关产品推荐
相关产品推荐

