[C/C++笔记] 文件读写操作fstream
1. 简介
fstream是C++标准库中用于文件读写的类。它提供了比底层C语言库更为高级的文件读写接口,因此使用起来更为方便和安全。
在使用fstream时,需要包含头文件<fstream>
。fstream类有三个派生类:
ifstream
:用于从文件中读取数据。fstream
:用于将数据写入到文件中。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以表示字符串的结束。否则,在打印或处理字符串时可能会出现未定义行为。