【问题标题】:what's the difference between ios_base::ate and ios_base::trunc?ios_base::ate 和 ios_base::trunc 有什么区别?
【发布时间】:2014-11-13 02:40:36
【问题描述】:

这是来自 MSDN 的文档: ate,在第一次创建其控制对象时查找流的末尾。

trunc,在创建控制对象时删除现有文件的内容。

我只是不明白它们之间的区别,以下两个代码sn-p的行为相同(它们在插入之前清除了内容),任何人都可以帮助我找出区别吗?

代码 sn-p 1:

ofstream ofs(L"F:\\iMoney.txt", ios_base::trunc);
ofs << L"Hello, money~" << endl;
ofs.close();

代码 sn-p 2:

ofstream ofs(L"F:\\iMoney.txt", ios_base::ate);
ofs << L"Hello, money~" << endl;
ofs.close();

【问题讨论】:

    标签: c++ windows


    【解决方案1】:

    要使std::ate 真正有意义,您需要打开一个fstream 以供读写:

    std::fstream file("iMoney.txt", std::ios::in | std::ios::out | std::ios::ate);
    

    这将保留现有内容,并且写入位置将从文件末尾开始,因此您写入的内容将附加到现有内容中,除非您使用seekp 将写入位置移动到其他位置。

    相比之下,如果您指定std::ios::trunc,则所有现有内容都将从文件中删除(无论指定std::ios::instd::ios::out 或两者都指定)。但是,如果您只指定std::ios::outstd::ofstream 的默认值),那么无论如何都会删除所有现有内容。唯一一次 std::ios::trunc 添加有用的东西是你同时指定了 inout,在这种情况下,如果你没有指定 std::ios::trunc,现有的内容将被保留

    【讨论】:

      【解决方案2】:

      如果文件为空文件或新文件,您的示例并没有太大区别,但如果文件已包含字符,则使用 std::ios_base::ate 打开并写入文件将 追加 个字符,而使用std::ios_base::trunc 打开后写入将覆盖这些字符。

      【讨论】:

      • 不,我的文件不是空的。 ios_base::ate 会先清除内容,然后再插入。
      猜你喜欢
      • 2012-08-28
      • 2016-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多