C ++ fstream定位,g ++和clang ++之间的不同行为

时间:2018-02-08 13:01:29

标签: c++ gcc clang fstream iostream

我使用的是使用C ++ std :: fstream的文件,我很难理解流的定位。我提取了一个示例代码来说明问题:

#include <iostream>
#include <fstream>
#include <string>
int main() {
    std::fstream f;
    std::string path = "test1.txt";

    f.exceptions(std::ios_base::badbit | std::ios_base::failbit | std::ios_base::eofbit);
    try {
        f.open(path, std::ios_base::in | std::ios_base::out | std::ios_base::binary | std::ios_base::ate);
    } catch (std::ios_base::failure &e) {
        std::cout << "Creating new file" << std::endl;
        f.open(path, std::ios_base::in | std::ios_base::out | std::ios_base::binary | std::ios_base::trunc);
        f.write("012345678\n", 10);
        return 0;
    }

    size_t fileSize = f.tellg();
    std::cout << fileSize << std::endl;

    f.seekg(0);
    f.seekp(0);

    char dataBuffer[8];
    f.read(dataBuffer, 8);

    f.write("a\n", 2);
    return 0;
}

我希望这段代码能够创建和维护一个10字节长的文件,但实际上每次运行程序时文件都会增加2个字节。任何人都可以解释为什么会这样吗?

我正在使用Apple LLVM编译器:
g ++ -v
配置为: - prefix = / Library / Developer / CommandLineTools / usr --with-gxx-include-dir = / usr / include / c ++ / 4.2.1
Apple LLVM版本9.0.0(clang-900.0.39.2)
目标:x86_64-apple-darwin17.4.0

修改

它在g ++上工作正常,奇怪的行为来自clang ++(clang 5.0测试)。

0 个答案:

没有答案