使用ifstream读取键盘输入文件名创建对象时出错的问题
解决ifstream无法打开文件的问题
我来帮你排查这个文件打开失败的问题~结合你用的是Mac环境和《Programming Principles and Practice Using C++》的上下文,主要问题大概率出在工作目录不匹配,另外还有个小细节需要修正,咱们一步步来:
1. 核心问题:程序运行的工作目录≠代码文件所在目录
Mac上的IDE(比如你可能用的Xcode)默认的运行工作目录不是你的main.cpp所在的文件夹,哪怕你把文本文件和代码放在一起,程序运行时还是找不到它。解决办法有两个:
临时方案:使用绝对路径
把文件名换成文件的绝对路径,比如你的文件在/Users/yourname/Documents/CPPProjects/Chapter10下的myin.txt,那输入的时候直接写这个完整路径,或者在代码里直接指定:string iname = "/Users/yourname/Documents/CPPProjects/Chapter10/myin.txt";这样能快速验证程序逻辑是否正确。
长期方案:修改IDE的工作目录(以Xcode为例)
- 点击顶部菜单栏的
Product→Scheme→Edit Scheme - 在弹出的窗口里选择
Run→Options标签页 - 勾选
Use custom working directory,然后点击右边的文件夹图标,选择你的代码和文本文件所在的目录
这样之后运行程序,输入文件名(比如myin.txt)就能正常找到文件了。
- 点击顶部菜单栏的
2. 文件名输入细节
确保你输入的文件名和实际文件完全一致:
- 注意大小写:虽然Mac默认文件系统大小写不敏感,但有些场景下会严格匹配,比如
MyIn.txt和myin.txt可能被识别为不同文件 - 不要漏掉后缀:如果你的文件是
myin.txt,就不要只输入myin
3. 代码里的小bug:sum未初始化
你的代码里int sum;没有初始化,这会导致求和结果是随机的垃圾值,记得改成:
int sum = 0;
修改后的完整代码
这里把sum初始化加上,同时保留用户输入文件名的逻辑:
#include "../../std_lib_facilities.h" int main(int argc, const char * argv[]) { cout << "Please enter the input file name: " << endl; string iname; cin >> iname; ifstream ist {iname}; if (!ist) error("Can't open input file ",iname); vector<int> numbers; int sum = 0; // 初始化sum为0 int n; while(ist>>n) { numbers.push_back(n); } for (int i=0; i<numbers.size(); ++i) { sum += numbers[i]; } cout << sum << endl; return 0; }
内容的提问来源于stack exchange,提问作者s_diaconu
相关产品推荐
相关产品推荐

