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.620120305(Red Hat 4.4.6-4)(GCC)

g ++ file02.cpp

./a.out

12 0

fs2.tellp()が0を出力するのに、12は出力しないのはなぜですか?

4

2 に答える 2

4

で出力用にファイルを開くと、 と の両方を設定するか、モード パラメータで設定しstd::ofstreamない限り、ファイルは切り捨てられます。std::ios_base::instd::ios_base::outstd::ios_base::app

std::ofstreamandのコンストラクターに渡されたモード パラメーターは、メンバー関数std::ifstreamに転送されます。std::filebuf::openその値は、C ライブラリ関数へのモード パラメータの対応する動作へのマッピングに従って、ファイルを開く方法を決定しますfopen。このマッピングは、 以外に設定されたすべてのフラグを考慮しますstd::ios_base::ate。要約すると、マッピングは次のようになります。

フラグの組み合わせ: in out trunc app | fopen モード
                        +「わ」
                        + + "あ"
                                  +「あ」
                        + + "わ"
                   + "r"
                   + + "r+"
                   + + + "w+"
                   + + + "a+"
                   + + "a+"

(C++03 では、設定されているappが設定されていない行が省略されました。これらは現在、設定されている行と両方が設定さoutれている行と同等です。)appout

また、std::ios_base::binaryが設定されている場合は、同等bのモードに追加されます。fopen

渡されたフラグの組み合わせ ( を無視std::ios_base::ate) がこれらの組み合わせのいずれとも一致しない場合、オープン失敗します。

は、モードおよびfopenのファイルを切り捨てることに注意してください。"w""w+"

std::ios_base::ateファイルを開いたときに位置がファイルの最後に設定されるようにします。これは、モード パラメータの残りの部分が開いているファイルが切り捨てられず、ファイルが既に存在し、サイズがゼロでない場合にのみ効果があります。

于 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 に答える