- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
#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::in
和 std: :ios_base::out
,或者你在 mode 参数中设置 std::ios_base::app
。
传递给 std::ofstream
和 std::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
的行;这些现在等同于设置了 app
和 out
都设置了。)
此外,如果设置了 std::ios_base::binary
,b
将附加到 fopen
模式等价物。
如果传递的标志组合(忽略 std::ios_base::ate
)与这些组合之一不匹配,则打开应该失败。
请注意,fopen
会截断模式 "w"
和 "w+"
的文件。
std::ios_base::ate
导致在打开文件时将位置设置为文件末尾。只有当模式参数的其余部分不会导致打开的文件被截断并且文件已经存在且大小非零时,这才会起作用。
关于c++ - ios_base::ate 和 tellp(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14480830/
#include #include #include using namespace std; class Logger { private: ofstrea
FatalMessageAssembler是一个通过 FatalMessageAssembler& operator FatalMessageAssembler& operator::basic_i
我正在尝试将一个复杂对象保存到一个文件中,我正在像这样在复杂对象中重载 > 运算符 class Data { public: string name; double rating; f
当我尝试执行以下操作时,标题中出现错误。 class Test { private: std::ifstream File; public: Test(); }; 测试::测试() {
我有一个看起来像这样的结构: sturct person { string surname; person(string n) : surname(n) {}; } 我需要重载 ope
答: std::ofstream("test.txt", std::ios_base::app); 乙: std::ofstream("test.txt", std::ios_base::app|st
头文件中可以看出 , 类 ios_base源自 template class _Iosb ,其中以下 static const variables定义: static const _Fmtflag
这是来自MSDN的文档:ate,在首次创建控制对象时寻找流的末尾。 trunc,在创建控制对象时删除现有文件的内容。 我只是无法理解它们之间的区别,以下两个代码片段的行为相同(它们在插入之前清除内容)
我有一个返回 unique_ptr 的 API给 API 用户。我想知道用户何时完成此流,以便我可以对他们刚刚写入的文件采取进一步的操作。必须关闭该文件,因为即将重新挂载分区。 这可能是这个问题的错误
27.6.3.4.2 Buffer management and positioning pos_type seekoff(off_type off, ios_base::seekdir way,
我一直在寻找将字符串转换为 int 的最佳方法,但遇到了一个我不理解的函数: template bool from_string(T& t, const std::
std::ios_base::ate(例如 std::ios_base::app 除外)和 std::的意义何在ios_base::trunc(例如std::ios_base::out除外)? 我应该
在 std::ios_base::out 中使用 std::ios_base::trunc 标志的目的是什么?我在很多例子中都看到了这一点。 我认为标准保证 std::ios_base::out 也会
对于我的一项作业,我被告知使用 cin.clear(ios_base::failbit) 来设置 failbit。我想知道,cin.clear(ios_base::failbit) 和 cin.set
我已经实现了查找最大值和最小值的函数。但我得到以下错误代码: [错误] 从“std::ios_base& (*)(std::ios_base&)”到“int”的无效转换 [-fpermissive]
ios_base 类中的静态常量在创建时进行初始化,这对于常量来说是有意义的。非常量静态成员变量是否可以用相同的方式初始化,或者这个概念是否只允许常量静态成员使用? 对于带有 gnu 编译器的非常量静
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
这个函数有两个不同的引用: 一个用 const 声明的 here ; 还有一个没有 const here ; 哪个是正确的? 最佳答案 标准说 (27.5.3.3) 定义应该是: locale get
我正在使用 libcurl 下载序列化代码并将其打开,但是,我收到一个错误,看起来 fstream 丢失了,但它包含在内。我环顾四周,但很少发现错误。下面是错误和代码。错过了什么? 编译错误输出 g+
我想知道为什么下面的代码没有按预期工作: #include #include using namespace std; int main(){ int n; string s;
我是一名优秀的程序员,十分优秀!