首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++ open()无明显原因失败

C++ open()无明显原因失败
EN

Stack Overflow用户
提问于 2010-04-14 15:56:56
回答 4查看 12.8K关注 0票数 1

以下代码:

代码语言:javascript
运行
复制
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

有什么建议吗?

编辑

我设法将它压缩到这个失败的最小测试用例中:

代码语言:javascript
运行
复制
#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,谢谢您的帮助.

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-04-14 16:12:17

你能确保文件名是你想的那样吗?

代码语言:javascript
运行
复制
cin >> filename; 
cout << filename; 

ifstream myFile(filename); 
if ( myFile.is_open() ) { 
   // ... 
}

在Unix/Linux系统中,请记住文件名是区分大小写的。

代码语言:javascript
运行
复制
ThisIsMyFile 
thisIsMyFile 

是两个独立的文件。

编辑

ifstream::open定义为:

代码语言:javascript
运行
复制
void open ( const char * filename, ios_base::openmode mode = ios_base::in );

打开名称为s的文件,将其内容与流对象关联,以便对其执行输入/输出操作。允许的操作和一些操作细节取决于参数模式。 该函数有效地调用rdbuf()->open(文件名,模式)。 如果对象已经具有关联的文件(打开),则函数将失败。 如果失败,则设置failbit标志(可以用成员failure检查),并且根据异常值集的不同,可能会引发异常。

尝试将"C:\test.txt“更改为"test.txt”,然后从"C:\“目录运行该程序。

以下是一个完全类似的示例:

代码语言:javascript
运行
复制
// 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
EN

Stack Overflow用户

发布于 2010-04-14 16:52:16

我建议从失败代码(包括cerrno.h)中打印errno,或者调用perror() (包括cstdio.h)。最终,C++方法将调用code函数,因此即使没有异常,也应该找到错误代码。

票数 3
EN

Stack Overflow用户

发布于 2010-04-14 16:36:30

文件名应该是C:\\test.txt还是C:\test.txt?反斜杠是C和C++及其他语言中的转义字符,您需要在输入中使用两个反斜杠才能得到一个反斜杠。换句话说,您可能需要C:\\\\test.txt,或者C://test.txt可能会工作(对于许多Windows文件处理,正斜杠就像反斜杠一样工作)。

编辑:反斜杠没有像我想的那样出现,显然这里的格式化代码有相同的转义约定。我用倒带引号改变了这一点,就好像字符串是代码一样。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2638956

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档