zoukankan      html  css  js  c++  java
  • ios::app与ios::ate的区别

    文件流

    ios::app

    ios::ate

    打开方式

    结果

    打开方式

    结果

    ofstream

    (默认是ios::in | ios::trunc)

    ios::app或ios::app|ios::out

    如果没有文件,生成空文件;

    如果有文件,在文件尾追加

    ios::ate或ios::ate|ios::out

    如果没有文件,生成空文件;

    如果有文件,清空该文件

    ios::app|ios::in

    不管有没有文件,都是失败

    ios::ate|ios::in

    如果没有文件,打开失败;

    如果有文件,定位到文件尾,可以写文件,但是不能读文件

    Ifstream

    (默认是ios::in)

    ios::app或ios::app|ios::out

    不管有没有文件,都是失败

    ios::ate或ios::ate|ios::out

    如果没有文件,打开失败;
    如果有文件,定位到文件尾,但是不能写文件

    ios::app|ios::in

    ?

    ios::ate|ios::in

    ?

    fstream

    (默认是ios::in | ios::out)

    ios::app|ios::out

    如果没有文件,创建文件;

    如果有文件,在文件尾追加

    ios::ate|ios::out

    如果没有文件,创建文件;

    如果有,清空文件

    ios::app|ios::in

    如果没有文件,失败

    ios::ate|ios::in

    如果没有文件,失败

    N/A

    N/A

    ios::ate|ios::out|ios::in

    如果没有文件,打开失败,

    如果有文件,定位到文件尾

    总结

    ios::app不能和ios::in相配合,

    但可以和ios::out配合,打开输入流

    ios::ate可以和ios::in配合,此时定位到文件尾;

    如果没有ios::in相配合而只是同ios::out配合,那么将清空原文件;

    区别

    app会在每次写操作之前都把写指针置于文件末尾,

    而ate模式则只在打开时才将写指针置于文件末尾。在文件操作过程中,可以通过seekp等操作移动指针位置。

    例子:

    多个线程或者进程对一个文件写的时候,假如文件原来的内容是abc

    以ios::app:

    第一个线程(进程)往里面写了个d,第二个线程(进程)写了个e的话,结果是abcde

    以ios:ate:

    后面写的会覆盖前面一个写的,第一个线程(进程)往里面写了个d,第二个线程(进程)写了个e的话,结果为abce

    参考:

    CSDN:ios::app与ios::ate打开方式有什么不同

    ofstream与ate的故事

  • 相关阅读:
    ansible变量
    nginx连接php测试
    redis发布订阅
    堡垒机实例以及数据库操作
    nginx简介,使用
    protobuf
    go NSQ
    go mod
    GIT版本管理工具教程
    linux命令查询网站
  • 原文地址:https://www.cnblogs.com/zhcncn/p/2851656.html
Copyright © 2011-2022 走看看