以下代码:
char filename[64];
ifstream input;
cout << "Please enter the filename: " << endl;
cin >> filename;
input.open(filename);
if (!input.is_open())
{
cout << "Opening file " << filename << " failed." << endl;
exit(1);
}
失败,它进入if()并退出。可能是什么原因造成的?我正在使用Microsoft Visual C ++。当我将文件名硬编码为常量时,它反而出现乱码:
http://pici.se/pictures/CNQEnwhgo.png
建议?
[编辑]
我设法将它压缩到这个失败的最小测试用例中:
#include <iostream>
#include <fstream>
using namespace std;
int main(int argc, char *argv[]){
ifstream input;
input.open("C:\\test.txt");
if (!input.is_open())
{
cout << "Failed." << endl;
exit(1);
}
return 0;
}
我想知道键盘图是否存在一些差异?我在一些字符集中输入文件名,而文件系统在其他名称下知道它?顺便说一下,我正在使用Windows。
[编辑] 感谢您的帮助,但我现在放弃了。我将使用C风格fopen代替。 :)
[编辑]噢,天啊。现在我觉得很蠢。事实证明该文件实际上名为test.txt.txt,Windows隐藏了第二个.txt再次感谢您的帮助...
答案 0 :(得分:3)
我建议在失败代码(包括cerrno.h)中打印errno
,或者调用perror()
(包括cstdio.h)。最终,C ++方法正在调用C stdlib函数,所以即使你没有得到异常,你也应该找到错误代码。
答案 1 :(得分:2)
您能确定文件名是您认为的吗?
cin >> filename;
cout << filename;
ifstream myFile(filename);
if ( myFile.is_open() ) {
// ...
}
在Unix / Linux系统上,请记住文件名区分大小写。
ThisIsMyFile
thisIsMyFile
是两个不同且独立的文件。
[编辑]
ifstream :: open定义为:
void open ( const char * filename, ios_base::openmode mode = ios_base::in );
打开名称为s的文件,将其内容与流对象相关联,以对其执行输入/输出操作。允许的操作和一些操作细节取决于参数模式。
该函数有效地调用rdbuf() - &gt; open(文件名,模式)。
如果对象已经关联(打开)文件,则该函数将失败。
失败时,会设置failbit标志(可以使用成员失败检查),并且根据异常设置的值,可能会抛出异常。
尝试将“C:\ test.txt”更改为“test.txt”并从“C:\”目录运行该程序。
Here is an exact similar sample:
// ifstream::is_open
#include <iostream>
#include <fstream>
using namespace std;
int main () {
ifstream infile;
infile.open ("test.txt");
if (infile.is_open())
{
while (infile.good())
cout << (char) infile.get();
infile.close();
}
else
{
cout << "Error opening file";
}
return 0;
}
如果显而易见的事情不起作用,那么就该启动调试器了。
答案 2 :(得分:0)
该文件名应该是C:\\test.txt
还是C:\test.txt
?反斜杠是C和C ++以及其他语言中的转义字符,输入中需要两个反斜杠才能得到一个。换句话说,您可能希望C:\\\\test.txt
或C://test.txt
可能正常工作(正斜杠的工作方式类似于反斜杠,用于大量Windows文件处理)。
编辑:反斜杠没有按照我的意图出现,因为这里的格式代码显然具有相同的转义约定。我通过引用反引号改变了这一点,就像字符串是代码一样。
答案 3 :(得分:0)
当前用户是否有权打开文件?