✨博客主页 | ||
---|---|---|
何曾参静谧的博客 | ||
📌文章专栏 | ||
「C/C++」C/C++程序设计 | ||
📚全部专栏 | ||
「VS」Visual Studio | 「C/C++」C/C++程序设计 | 「UG/NX」BlockUI集合 |
「Win」Windows程序设计 | 「DSA」数据结构与算法 | 「UG/NX」NX二次开发 |
「QT」QT5程序设计 | 「File」数据文件格式 | 「PK」Parasolid函数说明 |
目录
- C++ fstream详解
- 一、引言
- 二、头文件
- 三、基本类介绍
- 四、打开文件
- 五、关闭文件
- 六、文件读写操作
- 1.1 按行读取
- 1.2 按字符读取
- 1.3 按块(或缓冲区)读取
- 1.4 根据特定格式读取
- 七、流状态验证
- 八、获取和设置流指针
- 九、总结
C++ fstream详解
一、引言
C++ 中的文件操作是通过 fstream
文件流来实现的。fstream
是 C++ 标准库中的一个重要部分,它提供了一套完整的类和方法来简化文件的读写操作。这些类包括 ifstream
(用于读文件)、ofstream
(用于写文件)和 fstream
(用于同时读写文件)。
二、头文件
要使用 fstream
相关的功能,首先需要包含 <fstream>
头文件。例如:
#include <fstream>
三、基本类介绍
-
ifstream:
- 用于从文件读取数据。
- 继承自
istream
,支持使用>>
操作符进行读取。
-
ofstream:
- 用于向文件写入数据。
- 继承自
ostream
,支持使用<<
操作符进行写入。
-
fstream:
- 同时支持读写操作。
- 继承自
iostream
,支持>>
和<<
操作符。
四、打开文件
文件操作的第一步是打开文件。fstream
类提供了 open
成员函数用于打开文件。
void open(const char* filename, ios_base::openmode mode = ios_base::in | ios_base::out);
filename
:要打开的文件名。mode
:打开文件的模式,可以是以下选项的组合:ios::in
:以输入模式打开文件。ios::out
:以输出模式打开文件。ios::ate
:打开文件后定位到文件末尾。ios::app
:所有输出附加在文件末尾。ios::trunc
:如果文件已存在,先删除文件内容。ios::binary
:以二进制方式打开文件。
例如:
ofstream outfile;
outfile.open("Hello.txt", ios::out | ios::binary);
五、关闭文件
文件操作完成后,需要关闭文件以释放资源。fstream
类提供了 close
成员函数用于关闭文件。
void close();
例如:
outfile.close();
六、文件读写操作
- 文本文件读写:
- 使用
<<
操作符向文件写入数据。 - 使用
>>
操作符从文件读取数据。
- 使用
例如:
ofstream outfile("out.txt");
if (outfile.is_open()) {outfile << "This is a test." << endl;outfile.close();
}ifstream infile("out.txt");
if (infile.is_open()) {char buffer[256];while (infile >> buffer) {cout << buffer << endl;}infile.close();
}
当然,C++ 中读取文件的方式多种多样,除了基本的按行读取和按字符读取外,还有按块(或缓冲区)读取以及根据特定格式读取等方法。以下是对这些读取方式的详细说明:
1.1 按行读取
使用 getline
函数可以从文件中按行读取数据。这个函数有两个版本,一个接受 char*
类型的缓冲区和一个最大长度,另一个接受 std::string
对象。
#include <fstream>
#include <string>
#include <iostream>int main() {std::ifstream infile("example.txt");if (!infile.is_open()) {std::cerr << "Failed to open file." << std::endl;return 1;}std::string line;while (std::getline(infile, line)) {std::cout << line << std::endl;}infile.close();return 0;
}
1.2 按字符读取
可以使用 istream
类的 get
成员函数按字符读取文件。这个函数有多种重载形式,可以读取单个字符、字符数组或 std::string
对象。
#include <fstream>
#include <iostream>int main() {std::ifstream infile("example.txt");if (!infile.is_open()) {std::cerr << "Failed to open file." << std::endl;return 1;}char ch;while (infile.get(ch)) {std::cout << ch;}infile.close();return 0;
}
1.3 按块(或缓冲区)读取
可以使用 istream
类的 read
成员函数按块读取文件。这种方法通常用于二进制文件,但也可以用于文本文件。
#include <fstream>
#include <iostream>
#include <vector>int main() {std::ifstream infile("example.txt", std::ios::binary);if (!infile.is_open()) {std::cerr << "Failed to open file." << std::endl;return 1;}const std::streamsize bufferSize = 1024;char buffer[bufferSize];while (infile.read(buffer, bufferSize)) {std::cout.write(buffer, infile.gcount()); // gcount() 返回实际读取的字符数}// 处理可能的剩余数据if (infile.gcount() > 0) {std::cout.write(buffer, infile.gcount());}infile.close();return 0;
}
1.4 根据特定格式读取
对于特定格式的文件(如 CSV、JSON、XML 等),通常需要结合字符串解析和逻辑判断来读取数据。例如,对于 CSV 文件,可以按行读取,然后使用逗号作为分隔符来解析每一行的数据。
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
#include <iostream>int main() {std::ifstream infile("example.csv");if (!infile.is_open()) {std::cerr << "Failed to open file." << std::endl;return 1;}std::string line;while (std::getline(infile, line)) {std::stringstream ss(line);std::string item;std::vector<std::string> values;while (std::getline(ss, item, ',')) {values.push_back(item);}// 处理 values 向量中的数据for (const auto& val : values) {std::cout << val << " ";}std::cout << std::endl;}infile.close();return 0;
}
在实际应用中,选择哪种读取方式取决于文件的具体格式和读取需求。对于简单的文本文件,按行或按字符读取通常就足够了;对于二进制文件或复杂格式的文件,可能需要使用按块读取或根据特定格式读取的方法。
2. 二进制文件读写:
- 使用
write
函数写入数据。 - 使用
read
函数读取数据。
ofstream outfile("binary.dat", ios::binary);
if (outfile.is_open()) {char data[] = "Binary data";outfile.write(data, sizeof(data));outfile.close();
}ifstream infile("binary.dat", ios::binary);
if (infile.is_open()) {char buffer[256];infile.read(buffer, sizeof(buffer));cout << "Read from binary file: " << buffer << endl;infile.close();
}
七、流状态验证
fstream
类提供了一些成员函数来验证流的状态:
is_open()
:检查文件是否成功打开。bad()
:如果在读写过程中发生严重错误,返回true
。fail()
:除了bad()
的情况外,如果发生格式错误(如类型不匹配),也返回true
。eof()
:如果读文件到达文件末尾,返回true
。good()
:如果以上任何一个函数返回false
,则good()
返回true
。
八、获取和设置流指针
fstream
类提供了 seekg
和 seekp
函数来设置流指针的位置,以及 tellg
和 tellp
函数来获取流指针的当前位置。
// 设置输入流指针位置
istream& seekg(pos_type pos);
istream& seekg(off_type off, ios_base::seekdir dir);// 设置输出流指针位置
ostream& seekp(pos_type pos);
ostream& seekp(off_type off, ios_base::seekdir dir);// 获取输入流指针位置
pos_type tellg();// 获取输出流指针位置
pos_type tellp();
例如:
ifstream infile("example.txt");
if (infile.is_open()) {infile.seekg(10, ios::beg); // 定位到文件第10个字节char buffer[256];infile.read(buffer, 256);cout << buffer << endl;infile.close();
}
九、总结
fstream
是 C++ 中处理文件操作的重要工具。通过 ifstream
、ofstream
和 fstream
这三个类,可以方便地实现文件的读写操作。同时,fstream
类还提供了丰富的成员函数来验证流的状态、获取和设置流指针的位置,从而提高了文件操作的灵活性和可靠性。
希望这篇文章能帮助你更好地理解和使用 C++ 中的 fstream
文件流。