C ++的open()没有明显的原因失败[关闭](C++ open() fails for no a

2019-10-21 04:06发布

下面的代码:

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,感谢你的帮助......

Answer 1:

你能确保文件名是什么,你认为它是什么?

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;
}

如果这东西明显是行不通的,现在是时候火起来的调试器。



Answer 2:

我会建议印刷errno从故障代码中(包括cerrno.h),或致电perror()包括cstdio.h)。 最终,C ++方法调用C stdlib的功能,所以即使你没有得到一个例外,你应该找到的错误代码。



Answer 3:

如果该文件名读取C:\\test.txtC:\test.txt ? 反斜线在C和C ++等语言转义字符,你需要输入两个反斜杠得到一个。 换句话说,你可能希望C:\\\\test.txt ,或C://test.txt是可能的工作(正斜杠像反斜线工作了很多的Windows文件处理)。

编辑:反斜杠没有显示为我打算,因为显然这里的格式代码具有相同免俗。 我用反引号引用改变了这个,仿佛琴弦的代号。



Answer 4:

请问当前用户权限打开该文件?



文章来源: C++ open() fails for no apparent reason [closed]
标签: c++ file input