[c++] 文件读取与文件输出

总结一下最近用C++写系统时用到的关于文件流输入输出的相关内容。

(最近真的是在怀疑人生了……大一学C++我到底都学了些啥???少壮不努力老大徒伤悲……书到用时方恨少,是非经过不知难……以前欠下的现在都会还回来的……)


一、C++中支持文件输入输出的几个类

fstream提供了三个类,用来实现对文件的操作。

  1. fstream——打开文件以供读写
  2. ifstream——从文件中读取内容
  3. ofstream——向文件中写入内容

二、文件读入与输出的一些操作

1. 打开一个文件

被打开的文件在程序中用一个流对象来表示,对该对象所做的任何输入输出操作实际上就是对该文件所做的操作。

open( ) 函数用来打开一个文件:

void open ( const char* filename, openmode mode);

filename代表要打开的文件名, mode是打开的方式,是以下标识符的组合:

  •      ios::in             只读
  •      ios::out            只写
  •      ios::app            从文件末尾开始写
  •      ios::binary         二进制方式
  •      ios::nocreate       打开一个文件时,如果文件不存在,不创建文件
  •      ios::noreplace      打开一个文件时,如果文件不存在,创建该文件
  •      ios::trunc          如果文件已存在则先删除该文件
  •      ios::ate            打开一个文件时,将初始位置移动到文件尾

标识符组合使用时用或(|)操作符隔开

例如,想要打开“ helloworld.txt”文件写入一些数据:

ofstream file;

file.open( "helloworld.txt", ios::out | ios::app )

ofstream, ifstream 和 fstream 的成员函数 open( ) 都有默认的打开文件的方式:

  • ofstream —— ios::out | ios::trunc
  • ifstream  —— ios::in
  • fstream  ——  ios::in | ios::out

2. 判断文件是否打开成功

可以通过调用成员函数 is_open( ) 来检查一个文件是否已经被顺利的打开了:

bool is_open();

返回 true 代表文件已经被顺利打开,返回 false 则相反。

3. 关闭文件

当文件读写操作结束以后,需要关闭文件,让文件重新变成可访问状态。

close( ) 成员函数负责将缓存中的数据清除并关闭文件。

调用 close( ) 后, 原来的流对象就可以打开其他的文件, 且该文件可以重新被其他的进程所访问。

不过析构函数将自动调用 close 函数以防止流对象被销毁时还联系着打开的文件。

4. 一些验证流的状态的成员函数(返回值均为bool型)

  • bad()

如果在读写过程中出错,返回 true 。例如:当我们要对一个不是打开为写状态的文件进行写入时,或者我们要写入的设备没有剩余空间的时候。

  • fail()

除了与bad() 同样的情况下会返回 true 以外,格式错误时也返回true ,例如当想要读入一个整数,而获得了一个字母的时候。

  • eof()

如果读文件到达文件末尾,返回true。

  • good()

文件打开成功则返回true。

重置以上成员函数所检查的状态标志,可以使用成员函数clear()。

 

5. 流缓冲rdbuf()

rdbuf()用于获取/设置流缓冲区。可以实现一个流对象指向的内容用另一个流对象来输出。

例如:cin.rdbuf( )->in_avail( )

rdbuf( ) 获取cin的输入缓冲区。in_avail 获取输入缓冲区中存在的字符数。

整句话的意思就是获取 cin 缓冲区中还有多少字节没有处理的数据

 

三、文件读取与写入示例:

因为类ofstream, ifstream 和fstream 是分别从ostream, istream 和iostream 中引申而来的。所以fstream 的对象可以使用其父类的成员来访问数据。可以使用这些类与同控制台(console)交互同样的成员函数(cin 和 cout)来输入输出。

  • 读取string类型的文件:可以使用getline( )
// Read from a text file
#include <iostream>
#include <string>
#include <fstream>

int main(){
    ifstream in_file("in_example.txt");
    ofstream out_file("out_example.txt");
    string buffer;
    if(!in_file.is_open()){    //判断文件是否打开成功
        cout << "Failed to open file, pls check if file is exist or not.\n";
    }

    while(!in_file.eof()){    //判断文件是否读取到末尾
        in_file.getline(buffer, 100);
        out_file << buffer;
        out_file << endl;
    }
    in_file.close();
    out_file.close();
    return 0;
}
  • 读取int类型的数据:

如: in_file >> n1 >> n2;

……

(以后遇到相关问题再来更新~)


以前觉得文件读入和输出好复杂好难,其实只要自己试几遍,就能大致会用了,so 继续加油鸭!

发布了55 篇原创文章 · 获赞 63 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/m0_38068229/article/details/89421820