[C/C++笔记] 文件读写操作fstream

1. 简介

fstream是C++标准库中用于文件读写的类。它提供了比底层C语言库更为高级的文件读写接口,因此使用起来更为方便和安全。

在使用fstream时,需要包含头文件<fstream>。fstream类有三个派生类:

  1. ifstream:用于从文件中读取数据。
  2. fstream:用于将数据写入到文件中。
  3. fstream:既可以用于读取数据,也可以用于写入数据。如果需要同时读写同一个文件,则需要使用fstream。

2. 打开文件

使用fstream操作文件时,首先需要打开文件。可以使用open()成员函数来打开文件,并指定打开方式和文件名。

打开方式解释
ios::in为读文件而打开文件
ios::out为写文件而打开文件
ios::ate初始位置:文件尾
ios::app追加方式写文件
ios::trunc如果文件存在先删除,再创建
ios::binary二进制方式

注意: 文件打开方式可以配合使用,利用|操作符

#include <fstream>
using namespace std;

int main() {
    // 创建一个 ofstream 对象,用于向文件写入数据
    ofstream outfile("example.txt");

    // 创建一个 ifstream 对象,用于从文件读取数据
    ifstream infile("example.txt");

    // 创建一个 fstream 对象,用于同时读写文件
    fstream file("example.txt", ios::in | ios::out);

    // 检查文件是否成功打开
    if (!outfile.is_open()) {
        // 打开失败,进行相应的错误处理
    }

    // 关闭文件
    outfile.close();
    infile.close();
    file.close();

    return 0;
}

其中,ofstream对象的默认打开模式是ios::out,即只写模式;ifstream对象的默认打开模式是ios::in,即只读模式;而fstream对象则需要在打开时指定具体的打开模式。

3. 写入文件

使用ofstream对象可以向文件中写入数据,其常用的方法有:

  • open():打开文件。
  • is_open():检查文件是否成功打开。
  • close():关闭文件。
  • write(const char* s, streamsize n):将n个字节从字符串s中写入到文件中。
  • put(char c):将字符c写入到文件中。
  • <<运算符:与cout对象一样,可以通过<<运算符将数据写入到文件中。例如:outfile << “Hello world\n”;
#include <fstream>
using namespace std;

int main() {
    ofstream outfile("example.txt");
    if (!outfile.is_open()) {
        // 打开失败,进行相应的错误处理
    }

    outfile.write("Hello world\n", 12);

    outfile.put('H');
    outfile.put('e');
    outfile.put('l');
    outfile.put('l');
    outfile.put('o');
    outfile.put('\n');

    outfile << "This is another line\n";
    outfile << "This is the last line\n";

    outfile.close();

    return 0;
}

4. 读取文件

使用ifstream对象可以从文件中读取数据,其常用的方法有:

  • open():打开文件。
  • is_open():检查文件是否成功打开。
  • close():关闭文件。
  • read(char* s, streamsize n):从文件中读取n个字节到字符串s中。
  • get():从文件中读取一个字符。返回值为读取的字符的ASCII码,如果到达文件结尾则返回EOF(-1)。
  • getline (istream& is, string& str):从文件中读取一行数据到字符串s中。读取到换行符或达到指定的最大读取长度时停止。返回值为istream&类型,可以使用布尔运算符来检查是否读取成功。
  • >>运算符:与cin对象一样,可以通过>>运算符从文件中读取数据。例如:infile >> str;
#include <fstream>
#include <iostream>
#include <string>
using namespace std;

int main() {
    ifstream infile("example.txt");
    if (!infile.is_open()) {
        // 打开失败,进行相应的错误处理
    }

    char readbuff[13] = {0};
    infile.read(readbuff, 12);
    cout << readbuff;

    char c;
    while (1) {
        c = infile.get();
        cout << c;
        if (c == '\n')
        {
            break;
        }
    }
    
    /*
	char line[256] = {0};
    if (infile.getline(line, sizeof(line))) {
        line[infile.gcount()] = '\0';  // 添加 NULL 终止符
        cout << line << endl;
    }
    */
    
    string line;
    if (getline(infile, line)) {
        //当使用getline()函数读取文件时,每次读取到一行数据后,该行数据的结尾处的换行符会被自动删除。
        cout << line << endl;
    }

    while (infile >> line) {
    	//从文件中读取一个字符串,直到遇到空格、换行符或文件结尾为止
        cout << line << endl;
    }

    return 0;
}

输出结果:

Hello world
Hello
This is another line
This
is
the
last
line

4.1 getline()和fstream.getline()

getline()fstream.getline()都是读取一行字符的函数,但它们有以下几个区别:

  • 头文件不同:getline()属于C++标准库的一部分,需要包含头文件<string>;而fstream.getline()属于文件流类(fstream)的成员函数,需要包含头文件<fstream><iostream>

  • 参数不同:getline()的基本形式是 istream& getline(istream& is, string& str, char delim),其中is表示输入流对象,str表示存储读取结果的字符串,delim表示指定的分隔符。fstream.getline()的基本形式是istream& getline(char* s, streamsize n, char delim),其中s表示存储读取结果的字符数组指针,n表示要读取的最大字符数,delim表示指定的分隔符。

  • 返回值不同:getline()的返回值为输入流对象自身,因此可以进行链式调用;而fstream.getline()的返回值为输入流对象自身的引用。

  • 读取方式不同:getline()函数会将读取到的分隔符从输入流中提取并丢弃,而fstream.getline()函数不会。

另外,需要注意的是,在使用fstream.getline()函数时,需要手动在数组末尾添加一个空字符\0以表示字符串的结束。否则,在打印或处理字符串时可能会出现未定义行为。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值