【问题标题】:ofstream not working on linuxofstream 不能在 linux 上运行
【发布时间】:2015-01-10 16:37:10
【问题描述】:

我有一个简单的测试代码:

#include <string>
#include <iostream>
#include <fstream>

int main() {
std::ofstream strm = std::ofstream("test.txt");
strm << "TEST123";
strm.close();
return 0;
}

如果我在 Windows 上编译它,它可以完美运行。但是,当我使用以下命令在 debian 上编译它时: g++-4.7 -std=c++0x -lpthread TestStream.cpp -ldl -o TestStream 比它给出以下输出:

我用谷歌搜索了这个错误无济于事。有人知道如何解决这个问题吗?我在我的项目中使用了很多 ofstreams,也想在 linux 上编译它。

编辑:感谢 WinterMute,我现在可以编译它,但现在它打印空文件。我该如何解决这个问题?

EDIT2:不知道为什么,但第二次编译它工作。谢谢!

【问题讨论】:

  • Re: 编辑:你对工作目录/目标文件有写权限吗?
  • 你知道,没有任何理由发布图片而不是原始文本......
  • @Deduplicator 如果文本不容易复制,则存在
  • 那么,您的控制台在复制粘贴功能方面存在缺陷,但是制作屏幕截图是否有效?奇怪的设置,没想到Linux上有这样的......
  • 您可以使用鼠标在腻子中复制和粘贴。见the.earth.li/~sgtatham/putty/0.52/htmldoc/Chapter3.html

标签: c++ linux g++-4.7


【解决方案1】:

使用

std::ofstream strm("test.txt");

这个:

std::ofstream strm = std::ofstream("test.txt");

需要std::ofstream 没有的复制构造函数或仅从 C++11 开始可用的移动构造函数。 GCC 4.7 还没有完全支持 C++11,显然这是缺少的特性之一。

在 cmets 中,T.C.提到可移动流在计划于今年发布的版本 5 之前不会出现在 gcc 中。这让我感到意外,因为 gcc 声称在 4.8.1 版本中完全支持 C++11——这对于编译器是正确的,但对于 libstdc++ 则不然。现实的叮咬。

所以也许值得一提的是libc++(一个附属于 clang 和 llvm 的 c++ 标准库实现)实现了可移动的流,并且 clang 3.5 和 gcc 4.9(那些是我在这里尝试过的)编译原始如果使用它而不是 libstdc++ 的代码。

【讨论】:

  • 因为 Microsoft 希望您编写只能在 Windows 上编译和工作的代码。
  • 我真的很喜欢人们喜欢抨击微软的方式,即使它在这里不合规的 GCC/libstdc++ 也是如此。 std::ofstream strm = std::ofstream("test.txt"); 需要一个可访问的副本或移动构造函数。 std::ofstream 是可移动的,代码应该可以编译。 libstdc++ 没有实现可移动流。
  • 这不是 linux 的“问题”。
  • @Wintermute,该网站指的是对 C++11 语言 功能的完全支持,而不是完整的标准库实现。 GCC 主干中的库是完整的,除了 unicode codecvt facets 和 wstring_convertwbuffer_convert,但 4.8 的状态显示在 gcc.gnu.org/onlinedocs/gcc-4.8.4/libstdc++/manual/manual/…
  • C++11 状态页面不包含任何库特性,gcc.gnu.org/projects/cxx0x.html 表示“库实现的状态可以在这个table 中跟踪”
【解决方案2】:
std::ofstream strm = std::ofstream("test.txt");

ofstream 没有复制构造函数。

【讨论】:

    猜你喜欢
    • 2015-07-18
    • 1970-01-01
    • 2014-05-22
    • 2014-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-02
    相关资源
    最近更新 更多