【问题标题】:File won't open, even though stat() can find it文件不会打开,即使 stat() 可以找到它
【发布时间】:2012-12-23 08:41:31
【问题描述】:

我有一个 C++ 文档,我需要在其中打开一个文件。我没有使用相对路径来引用我的文件。我目前正在使用硬盘驱动器上的完整文件路径,但稍后我将切换到仅使用当前目录。在任何情况下,我都知道这个文件被正确引用并且可以打开,因为我已经对文件名执行了 stat() 并且它返回了有关该文件的所有正确信息。以下是正在发生的基本过程:

string fName = "C:\\Users\\[user]\\Downloads\\file.DAT";
ifstream inFile;
inFile.open(fName);

struct _stat buf;                        // I put these lines here to test that
int result = _stat(fName.c_str(), &buf); // the file is being referred-to right

inFile >> levelnumber;
if(inFile.fail())  // inFile.fail() keeps evaluating to TRUE
    ThrowError("Corrupt or inaccesible .DAT file."); // I wrote ThrowError

无论如何,inFile.fail() 一直评估为 true,即使文件肯定被正确引用(这就是对 _stat() 的调用检查的内容)。

我做错了什么? :P

【问题讨论】:

  • stat 可以告诉您有关文件的详细信息,即使您没有读取内容的权限。如果您正在寻找这种行为,您可能需要查看 access 函数。
  • 您也可以查看bufst_mode 成员。
  • levelnumber 的声明是什么?文件开头的数据是否正确解析为该类型?
  • 另外,您永远不会检查_stat 调用的结果。如果它类似于 POSIX stat 函数,那么您应该检查结果为 0 以假设成功。

标签: c++ file-io stat


【解决方案1】:

您的测试没有告诉您文件是否可以打开。您的测试告诉您文件无法打开或levelnumber 无法读取。要测试您的文件是否已打开,您可以在调用open() 后立即检查该文件。如果文件确实可读,它应该转换为true

std::ifstream inFile(fName);
if (!inFile) {
    std::cerr << "failed to open '" << fName << "' for reading\n";
}

【讨论】:

  • 好的。这很有帮助。我认为它一定是正确打开文件但没有正确读取数据。事实证明,我实际上应该使用二进制文件 I/O 来完成我正在做的事情。我想我可以从这里拿走它......
猜你喜欢
  • 1970-01-01
  • 2023-01-31
  • 2019-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-12
  • 1970-01-01
相关资源
最近更新 更多