【问题标题】:Unable to write file in C++无法在 C++ 中写入文件
【发布时间】:2009-10-12 22:21:06
【问题描述】:

我正在尝试最基本的东西....用 C++ 编写一个文件,但该文件没有被写入。我也没有收到任何错误。也许我遗漏了一些明显的东西……还是什么?

我认为我的代码有问题,但我也尝试了我在网上找到的示例,但仍然没有创建文件。

这是代码:

ofstream myfile;
myfile.open ("C:\\Users\\Thorgeir\\Documents\\test.txt");
myfile << "Writing this to a file.\n";
myfile.close();

我也尝试过手动创建文件,但根本没有更新。

如果这与此有关,我正在运行 Windows 7 64 位。这就像文件写入操作被完全禁止,并且没有显示错误消息或异常。

【问题讨论】:

  • 我知道这不是解决方案,但我以前也遇到过这种情况。只需将 ofstream 替换为 fstream
  • 你确定那里有一个名为“Documents”的文件夹吗?如果我没记错的话,它通常被命名为“我的文档”...
  • @Jerry 自 Vista 以来它已更改为“文档”。
  • 复制这段sn-p代码时,更改路径;)

标签: c++ windows-7 writefile


【解决方案1】:

你需要以写模式打开文件:

myfile.open ("C:\\Users\\Thorgeir\\Documents\\test.txt", ios::out);

请务必查看第二个参数的其他选项。例如,如果您正在编写二进制数据,则需要 ios::binary

您还应该在打开流后检查它:

myfile.open(...
if (myfile.is_open())
    ...

更新:

AraK 是对的,我忘了ofstream 默认处于写入模式,所以这不是问题。

也许您只是没有对该目录的写入/创建权限? Win7默认很多目录都有“全部拒绝”的特殊权限。或者该文件可能已经存在并且是只读的?

【讨论】:

  • @Tim 好点,但 std::ios::out 是在 ofstream 的构造函数中默认设置的。
【解决方案2】:

先把斜线转过来。
甚至 Windows 也能理解斜线是相反的。

ofstream myfile("C:/Users/Thorgeir/Documents/test.txt");

您可以测试是否有任何错误:

if (!myfile)
{
    std::cout << "Somthing failed while opening the file\n";
}
else
{
    myfile << "Writing this to a file.\n";
    myfile.close();
}
  • 确保目录存在。
  • 如果文件存在,请确保它是可写的(由您)
  • 检查您正在写入的目录是否可写(由您)

【讨论】:

  • 为什么建议使用不是目标平台原生的路径分隔符?尤其是当它什么都解决不了的时候?奇数。
  • @Tomalak:不是这样。 '\' 的使用充其量是容易出错的,因为它是一个转义字符(没有编译时检查以确保它被正确使用)。 MS 十年前就认识到了这个问题,并增加了对“/”的支持,该计划是为了与其他操作系统兼容。不幸的是,他们陷入了向后兼容性问题/
  • @Tomalak:那么你很幸运能与一群从不犯错的开发人员一起工作。另一方面,我与许多糟糕的开发人员(不是我现在的同事)一起工作,不得不多次修复丢失的额外反斜杠。此外,现在将代码中的目录剪切并粘贴到 shell 中也不能像您想要的那样干净。
【解决方案3】:

您是否阅读过有关 Windows Vista 和 7 中的 UAC(用户帐户控制)和 UAC 虚拟化/数据重定向的信息?您的文件可能实际上在虚拟商店中。

User Account Control Data Redirection

您的示例输出目录在用户中,所以我认为这不会是问题,但有可能值得一提,如果您不注意它可能会非常令人沮丧!

希望这会有所帮助。

【讨论】:

    【解决方案4】:

    这段代码应该能捕捉到任何错误。如果遇到任何错误,很可能是权限问题。确保您可以读取/写入要在其中创建文件的文件夹。

    #include "stdafx.h"
    #include <fstream>
    #include <iostream>
    
    bool CheckStreamErrorBits(const std::ofstream& ofile);
    
    int _tmain(int argc, _TCHAR* argv[]) {
     std::ofstream ofile("c:\\test.txt");
     if(ofile.is_open()) {
      CheckStreamErrorBits(ofile);  
      ofile << "this is a test" << std::endl;
      if(CheckStreamErrorBits(ofile)) {
       std::cout << "successfully wrote file" << std::endl;
      }
     }else {
      CheckStreamErrorBits(ofile);
      std::cerr << "failed to open file" << std::endl;
     }
    
     ofile.close();
     return 0;
    }
    
    //return true if stream is ok.  return false if stream has error.
    bool CheckStreamErrorBits(const std::ofstream& ofile) {
     bool bError=false;
     if(ofile.bad()) {
      std::cerr << "error in file stream, the bad bit is set" << std::endl;
      bError=true;
     }else if(ofile.fail()) {
      std::cerr << "error in file stream, the fail bit is set" << std::endl;
      bError=true;
     }else if(ofile.eof()) {
      std::cerr << "error in file stream, the eof bit is set" << std::endl;
      bError=true;
     }
     return !bError;
    }
    

    更新: 我只是在 Windows 7 Enterprise 下测试我的代码,但第一次失败(设置了失败位)。然后我关闭用户帐户控制(UAC)并再次测试并写入文件。这可能与您看到的问题相同。要关闭 UAC,请转到:

    控制面板(按小图标查看)|用户帐户 |更改用户帐户控制设置。将其设置为从不通知,然后单击确定按钮。您必须重新启动才能使更改生效。

    我很好奇如何使它与 UAC 一起工作,我会研究一下。

    【讨论】:

      【解决方案5】:

      试试这个:

      if( ! myfile)
      {
      cerr << "You have failed to open the file\n";
      
      //find the error code and look up what it means.
      }
      

      【讨论】:

      • 在您的回答中值得一提的是,这是 Microsoft 特有的。 C++ 没有流失败的“错误代码”;只有故障模式。
      • @Tomalak:也许吧,但提问者使用的是 Windows,所以当时我正在努力帮助他们。
      【解决方案6】:

      使用 FileMon 并从您的进程中查找失败的 WriteFile 调用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-30
        • 1970-01-01
        • 2016-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多