以下代码:
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()并退出。这可能是什么原因?我正在使用MicrosoftVisualC++。当我将文件名硬编码为常量时,它反而被混淆了:
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,而.txt再次隐藏了第二个.txt,谢谢您的帮助.
发布于 2010-04-14 16:12:17
你能确保文件名是你想的那样吗?
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()->open(文件名,模式)。 如果对象已经具有关联的文件(打开),则函数将失败。 如果失败,则设置failbit标志(可以用成员failure检查),并且根据异常值集的不同,可能会引发异常。
尝试将"C:\test.txt“更改为"test.txt”,然后从"C:\“目录运行该程序。
以下是一个完全类似的示例:
// 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;
}如果有这么明显的事情不起作用,那么是时候启动调试器了。
发布于 2010-04-14 16:52:16
我建议从失败代码(包括cerrno.h)中打印errno,或者调用perror() (包括cstdio.h)。最终,C++方法将调用code函数,因此即使没有异常,也应该找到错误代码。
发布于 2010-04-14 16:36:30
文件名应该是C:\\test.txt还是C:\test.txt?反斜杠是C和C++及其他语言中的转义字符,您需要在输入中使用两个反斜杠才能得到一个反斜杠。换句话说,您可能需要C:\\\\test.txt,或者C://test.txt可能会工作(对于许多Windows文件处理,正斜杠就像反斜杠一样工作)。
编辑:反斜杠没有像我想的那样出现,显然这里的格式化代码有相同的转义约定。我用倒带引号改变了这一点,就好像字符串是代码一样。
https://stackoverflow.com/questions/2638956
复制相似问题