C ++ open()失败没有明显的原因

时间:2010-04-14 15:56:57

标签: c++ file input

以下代码:

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再次感谢您的帮助...

4 个答案:

答案 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.txtC://test.txt可能正常工作(正斜杠的工作方式类似于反斜杠,用于大量Windows文件处理)。

编辑:反斜杠没有按照我的意图出现,因为这里的格式代码显然具有相同的转义约定。我通过引用反引号改变了这一点,就像字符串是代码一样。

答案 3 :(得分:0)

当前用户是否有权打开文件?