C++ 实现用户输入文件名打开txt文件失败,应如何排查解决?
问题原因及修复方案
1. 核心代码错误
直接导致文件打开失败的是以下代码:filename = filename.substr(0, filename.length() - 1);
getline(cin, filename)读取用户输入时,会自动丢弃输入末尾的换行符,不会将换行符存入filename变量。这行代码会主动删除文件名的最后一位有效字符,比如输入inventory.txt会被处理成inventory.tx,和实际文件名不匹配,自然无法找到文件。- 直接删除这行代码即可解决绝大多数打开失败问题。
2. 文件存放位置要求
如果输入的是不带路径的纯文件名:
- 直接双击运行编译好的exe时,文件需要和exe放在同一个文件夹
- 在IDE中调试运行时,文件需要放在项目工程的根目录(和项目配置文件、源代码同目录,具体以IDE的工作目录配置为准)
- 也可以直接输入文件的绝对路径(如
C:\data\inventory.txt),无需考虑存放位置限制。
3. 其他潜在代码隐患
- 不要用
while (!fin.eof())作为循环结束条件:eof标记是读取操作失败后才会触发,会导致最后一行多执行一次循环,读到无效内容。可以修改为while (getline(fin, items[num_items].description) && num_items < max_items) - 读取描述后的截字符操作
items[num_items].description = items[num_items].description.substr(0, items[num_items].description.length() - 1);会删除每行末尾的有效字符,除非你的文件每行末尾有多余的特殊字符,否则建议删除这行代码。 - 现有代码未判断数组越界风险,当文件条目数超过30时会导致程序崩溃,建议在循环中增加
num_items < max_items的判断条件。
内容的提问来源于stack exchange,提问作者ATSpiro
相关产品推荐
相关产品推荐

