添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

一、文件流

C++的IO类中定义了三个文件读写流fstream、ifstream以及ofstream,它们都继承于相同的父类istream,通过不同的实现以实现不同的文件流操作。

三者的区别为:

  • ifstream:从文件读取数据
  • ofstream:从文件写入数据
  • fstream:既可以读数据、又可以写数据
  • 1.1 IO接口和读写模式

    三个文件流实现了以下几个函数接口:

    这些模式可以单独使用,也可以组合使用,如果需要组合使用,使用逻辑操作符 | 或起来即可。这里要特别注意的是 ios::out 模式默认会截断文件,也就是说, ios::out ios::out | ios::trunc 效果是一样的,都会将文件截断。如果不希望以截断方式打开文件时,则需要设置读写模式为 ios::out | ios::app ,以这种模式打开文件后,数据会以追加的方式写入到文件。

    1.2 读写文件示例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    // 写文件
    void write_file ( ) {
    ofstream output ;
    // 待写入数据
    string output_data = "HelloWorld\nWelcome To Tencent\n" ;
    // 打开文件
    output . open ( "test.txt" , ios :: out ) ;
    // 写入数据
    output . write ( output_data . c_str ( ) , output_data . size ( ) ) ;
    // 关闭文件
    output . close ( ) ;
    }

    注意: 在使用IO操作符从文件读取数据的时候,数据输入的对象可以是字符串,也可以是对应的数据类型(如int)。如果输入到字符串,默认是读到空白字符的时候就停止了,需要通过循环控制读取后面的数据。

    二、流状态

    流在执行IO操作的时候,会根据不同的情况产生不同的状态码,如:

    我们可以使用已经封装好的函数 bad()/fail()/eof()/good() 来判断当前IO是否已经达到某种状态,如判断文件是否已经读到结束。同时,我们还可以使用 clear() 函数来清除当前IO对象的状态位,当流已崩溃(如将流中的字符串对象读到一个int对象上)时,可以手动来清除状态位继续往下读取。

    示例,使用eof标志位判断文件是否读完成

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    ofstream output ( "test.txt" ) ;
    ifstream input ( "test.txt" ) ;
    std :: string input_data ;
    output << "Hello World\n" ;
    output . close ( ) ;
    while ( ! input . eof ( ) ) { // 没有读到文件尾就一直读取
    input_data . clear ( ) ;
    input >> input_data ; // 读到空白符就停止
    // 过滤掉空行
    if ( input_data == "" ) continue ;
    cout << input_data << endl ;
    }
    input . close ( ) ;

    因为使用IO操作符从流中读取数据默认遇到空行就停止,所以 Hello World\n 字符串需要读三次才能读完,第一次是 Hello ,第二次是 World ,第三次是换行后的空行,所以,最后的输出结果是:

    三、getline一次读一行

    流对象中内置了getline()成员方法可以一次读一行数据到字符串数组中,需要传入一个字符数组和最大长度size:

    ifstream input("aabbcc.txt", ios::in); if (!input) { cout << "open fail error: " << strerror(errno) << endl; 使用形式: using指令(using directive)的使用形式为using namespace std。 using声明(using declaration)的使用形式为using std::... 1,274 评论 一、const和成员函数的故事 const的用途有以下几种: 修饰全局、局部、成员变量 修饰成员函数 修饰变量的时候const限制了变量在整个程序运行期间都是不能修改的,而修饰成员函数的时候限制函数内... 1,579 1 一、前言 昨天在公司做代码扫描,发现很多类似以下的代码都产生了告警,导致扫描不通过: virtual int func() override {} 不通过的原因是:同时使用virtual和overri... 3,297 1 问题场景:服务器有多个网卡,分别绑定了地址A、地址B和地址C,当客户端连接请求过来的时候,如何知道是从哪个IP地址请求过来的? 解决方案:服务端accept客户端的连接后,对这个新接受的socket进... 1,150 评论