3
#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 (Red Hat 4.4.6-4) (GCC)

g++ 文件02.cpp

./a.out

12 0

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

4

2 回答 2

4

当您打开一个文件以输出时std::ofstream,它会被截断,除非您同时设置std::ios_base::inand std::ios_base::out,或者您std::ios_base::app在 mode 参数中设置。

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

标志组合:in out trunc app | 开放模式
                        + "w"
                        + + “一个”
                                  +“一个”
                        + + "w"
                   + "r"
                   + + "r+"
                   + + + "w+"
                   + + + “一个+”
                   + + “一个+”

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

此外,如果std::ios_base::binary设置了,b则附加到fopen等效模式。

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

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

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

于 2013-01-23T13:41:46.110 回答
0

out再次打开文件进行写入时,您没有提供标志。这样做:

std::ofstream fs2(fileName, std::ios_base::out | std::ios_base::ate);
于 2013-01-23T13:28:09.203 回答