gpt4 book ai didi

c++ - ios_base::ate 和 tellp()

转载 作者:太空狗 更新时间:2023-10-29 21:25:07 26 4
gpt4 key购买 nike

#include <fstream>
#include <iostream>

int main()
{
const char* fileName = "out1";
std::ofstream fs1(fileName);
fs1 << "AAAAAAAAAAA\n";
std::cout << fs1.tellp() << std::endl;
fs1.close();

std::ofstream fs2(fileName, std::ios_base::ate);
std::cout << fs2.tellp() << std::endl;
fs2.close();

return 0;
}

gcc 版本 4.4.6 20120305(红帽 4.4.6-4)(海湾合作委员会)

g++ 文件02.cpp

./a.out

120

为什么 fs2.tellp() 打印 0 而不是 12?

最佳答案

当您使用 std::ofstream 打开文件进行输出时,它会被截断,除非您同时设置了 std::ios_base::instd: :ios_base::out,或者你在 mode 参数中设置 std::ios_base::app

传递给 std::ofstreamstd::ifstream 构造函数的模式参数被转发给 std::filebuf::open 成员函数。它的值根据模式参数到 C 库函数 fopen 的对应行为的映射确定文件的打开方式。此映射考虑了除 std::ios_base::ate 之外的所有标志集。概括起来映射如下:

Flag combination:  in  out trunc app | fopen mode                        +              "w"                        +         +    "a"                                  +    "a"                        +    +         "w"                   +                   "r"                   +    +              "r+"                   +    +    +         "w+"                   +    +         +    "a+"                   +              +    "a+"

(C++03 省略了设置了 app 但未设置 out 的行;这些现在等同于设置了 appout 都设置了。)

此外,如果设置了 std::ios_base::binaryb 将附加到 fopen 模式等价物。

如果传递的标志组合(忽略 std::ios_base::ate)与这些组合之一不匹配,则打开应该失败。

请注意,fopen 会截断模式 "w""w+" 的文件。

std::ios_base::ate 导致在打开文件时将位置设置为文件末尾。只有当模式参数的其余部分不会导致打开的文件被截断并且文件已经存在且大小非零时,这才会起作用。

关于c++ - ios_base::ate 和 tellp(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14480830/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com