我正在尝试用C ++打开一个文件,但它似乎给了我一些麻烦,这是到目前为止处理打开文件的代码:
void CreateHistogram(string str_file, vector<HistogramWord> &result) {
string line;
long location;
HistogramWord newWord;
const char * filename = str_file.c_str();
//ifstream myfile (str_file.c_str());
ifstream myfile (filename);
//myfile.open(filename);
if (myfile.is_open()) {
while (myfile.good()) {
getline(myfile, line);
line = clarifyWord(line);
好的,只是为了解释一下,HistogramWord是一个在头文件中定义的结构,从我在在线文档中读到的,文件名必须是const char *
类型,所以这就是我已经做好了。已将str_file
转换为const char *
。
现在,我尝试了一些不同的东西,这就是为什么有些代码被注释掉了。当它到达行if (myfile.is_open())
时,它总是计算为false。任何人似乎都知道为什么?
谢谢, 布兰登
答案 0 :(得分:1)
确定IO 101
如果您不提供完整的文件路径但仅提供文件名,则当前工作目录将附加到文件名。
因此,如果你的.exe在C:\ temp中,你从这个目录调用你的程序,你的文件名是test.txt,那么在这种情况下完整的文件名将是C:\ temp \ test.txt
这仅在.exe和test.txt都在C:\ temp下时才有效。
在所有其他情况下,它将失败。你可以使用win API或linux等价创建绝对路径 - 我不知道你在哪个平台上。
现在,为了阅读一个完全打开的文件,这就足够了:
void CreateHistogram(string str_file, vector<HistogramWord> &result) {
string line;
long location;
HistogramWord newWord;
ifstream myfile (str_file.c_str());
if (myfile.is_open()) {
while (getline(myfile, line)) {
line = clarifyWord(line);
}
else{
//throw exception, print error message etc
throw std::exception(std::string("Couldn't open file : " + str_file).c_str());
}
}
编辑:谢谢@ Shahbaz
答案 1 :(得分:0)
我最好的猜测是Windows“隐藏已知文件类型的扩展名”,因此该文件的名称实际上与您在Windows中的名称不同。例如,如果它是一个.txt文件,并且你将其命名为test.txt,那么实际的名称将是test.txt.txt,这对windows来说是非常愚蠢的。
要更改此设置,请转到我的电脑 - &gt; Toold - &gt;文件夹选项 - &gt;并取消选中“隐藏已知文件类型的扩展名”框。这是为XP。如果你有另一个窗口,它应该或多或少是相同的路径。如果没有看到工具栏,请尝试使用ALT + t(工具)或ALT + f(文件)使其显示。
这个问题让我们很多人在大学第一学期遇到麻烦。
答案 2 :(得分:0)
对我来说,解决此问题的方法是在文件路径中使用正斜杠而不是双反斜杠。
例如
inFile.open("path/to/file.txt")
代替
inFile.open("path\\to\\file.txt")