下面的代码:
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);
}
出现故障时,它进入如果()并退出。 怎么可能是原因呢? 我使用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,顺便说一句。
[编辑]感谢您的帮助,但我现在放弃了。 我会改用的fopen空调风格。 :)
[编辑]哦,我的上帝。 现在,我觉得自己太愚蠢。 原来的文件实际上是一个名为test.txt.txt和Windows再次躲到第二.TXT,感谢你的帮助......
你能确保文件名是什么,你认为它是什么?
cin >> filename;
cout << filename;
ifstream myFile(filename);
if ( myFile.is_open() ) {
// ...
}
在Unix / Linux系统,请记住,文件名是区分大小写的。
ThisIsMyFile
thisIsMyFile
是两个不同的独立文件。
[编辑]
:: ifstream的开放的定义是:
void open ( const char * filename, ios_base::openmode mode = ios_base::in );
打开,其名称为s,其与该流对象信息内容相关联来在其上执行输入/输出操作的文件。 该业务允许和一些操作细节取决于参数模式。
该功能有效地调用rdbuf() - >打开(文件名,模式)。
如果对象已经有相关的(打开)的文件,该功能失效。
如果失败,则failbit标志被设置(其可以与构件失败进行检查),并根据与异常的异常可能抛出设置的值。
尝试改变“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;
}
如果这东西明显是行不通的,现在是时候火起来的调试器。
我会建议印刷errno
从故障代码中(包括cerrno.h),或致电perror()
包括cstdio.h)。 最终,C ++方法调用C stdlib的功能,所以即使你没有得到一个例外,你应该找到的错误代码。
如果该文件名读取C:\\test.txt
或C:\test.txt
? 反斜线在C和C ++等语言转义字符,你需要输入两个反斜杠得到一个。 换句话说,你可能希望C:\\\\test.txt
,或C://test.txt
是可能的工作(正斜杠像反斜线工作了很多的Windows文件处理)。
编辑:反斜杠没有显示为我打算,因为显然这里的格式代码具有相同免俗。 我用反引号引用改变了这个,仿佛琴弦的代号。