在C++编程中,文件操作是一个重要的组成部分,它允许程序读取、写入和处理文件数据。为了执行文件操作,C++提供了一系列的类和函数,这些都包含在标准库的<iostream>和<fstream>头文件中。
目录
一、I/O流
头文件 <fstream>
C++中把对文件的读写操作都封装在以下类中:
ofstream 对文件的写操作,继承了ostream类的功能
ifstream 对文件的读操作,继承了istream类的功能
fstream 对文件的读写操作,继承了ofstream\ifstream类的功能
二、文本文件
1.写文件
1.包含头文件 #include <fstream>
2.创建流对象 ofstream ofs;
3.打开文件 ofs.open("文件路径",打开方式);
打开方式:
ios::in 为读文件而打开文件
ios::out 为写文件而打开文件
ios::ate 初始位置:文件尾
ios::app 追加的方式写文件
ios::trunc 如果文件存在,先删除后创建
ios::binary 以二进制方式打开文件
文件打开方式可以配合使用,利用“|”操作符
4.写数据 ofs<<"要写入的数据";
5.关闭文件 ofs.close();
2.写文件
1.包含头文件 #include <fstream>
2.创建流对象 ifstream ifs;
3.打开文件并判断文件是否打开成功 ifs.open("文件路径",打开方式);
判断文件是否打开成功
a、使用 !类对象名 的方式进行判断
if(!ifs){}
else {}
b、使用 good\fail 成员函数进行判断上一次文件操作是否成功\失败 需要注意返回值
4.读数据
1. 逐行读取:使用 getline
getline
可以逐行读取文本文件的内容,适合读取整行数据。
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main() {
ifstream inputFile("example.txt"); // 打开文件
if (!inputFile.is_open()) {
cout << "无法打开文件" << endl;
return 1;
}
string line;
while (getline(inputFile, line)) {
cout << line << endl; // 输出读取的每一行
}
inputFile.close(); // 关闭文件
return 0;
}
CopyInsert
2. 读取一个单词:使用 >>
操作符
可以使用 >>
操作符读取文件中的一个单词(以空格、换行等为分隔符)。
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main() {
ifstream inputFile("example.txt");
if (!inputFile.is_open()) {
cout << "无法打开文件" << endl;
return 1;
}
string word;
while (inputFile >> word) { // 读取下一个单词
cout << word << endl; // 输出读取的单词
}
inputFile.close();
return 0;
}
CopyInsert
3. 读取字符:使用 get
方法
可以使用 get
方法逐个读取字符。
#include <iostream>
#include <fstream>
using namespace std;
int main() {
ifstream inputFile("example.txt");
if (!inputFile.is_open()) {
cout << "无法打开文件" << endl;
return 1;
}
char ch;
while (inputFile.get(ch)) { // 逐个读取字符
cout << ch; // 输出读取的字符
}
inputFile.close();
return 0;
}
CopyInsert
4. 读取特定数量的字符:使用 read
方法
可以使用 read
方法指定读取特定数量的字符。
#include <iostream>
#include <fstream>
using namespace std;
int main() {
ifstream inputFile("example.txt", ios::binary); // 以二进制模式打开文件
if (!inputFile.is_open()) {
cout << "无法打开文件" << endl;
return 1;
}
char buffer[256];
while (inputFile.read(buffer, sizeof(buffer))) { // 每次读取256个字节
cout.write(buffer, inputFile.gcount()); // 输出读取的字符
}
inputFile.close();
return 0;
}
CopyInsert
5. 使用 istreambuf_iterator
读取整个文件
可以通过 istreambuf_iterator
一次性读取整个文件。
#include <iostream>
#include <fstream>
#include <iterator>
using namespace std;
int main() {
ifstream inputFile("example.txt");
if (!inputFile.is_open()) {
cout << "无法打开文件" << endl;
return 1;
}
// 使用迭代器直接输出整个文件内容
cout << std::istreambuf_iterator<char>(inputFile);
inputFile.close();
return 0;
}
三、二进制文件
二进制文件打开方式要指定为ios::binary
1.二进制读写操作
ostream &write(const char *buffer,streamsize num);
功能:以二进制方式写入文件
buffer:待写入数据的内存首地址
num:要写入的字节
注意:C++中文件I/O流的write只有两种结果,要么num个字节全部写入成功,要么一个都没有写入,只需要使用 good\fail 判断是否写入成功
istream &read( char *buffer, streamsize num );
功能:以二进制方式读文件
buffer:存储数据的内存首地址
num:要读取的字节数
streamsize gcount();
功能:获取上一次读文件操作时读到的字节数
注意:在以二进制方式读写对象时,对象的成员不应该有指针(以及string)类型,因为在写入时只会写入指针成员变量(地址编号),而下一次读取该指针变量时,该指针所指向的内存极大可能不是指向上次写入时的内存了,因此读到的该编号没意义了
四、C++的随机读写
C++为文件IO流提供了两套设置文件位置指针的成员函数,目的为了兼容有两个位置指针的操作系统,但是UNIX\Linux和Windows系统底层只有一个位置指针,所以使用哪套都可以
istream &seekg(off_type offset,ios::seekdir origin);
功能:通过偏移值+基础位置 设置 输入流位置指针的位置
offset:偏移量
origin:基础位置
ios::beg 文件开头
ios::cur 当前位置
ios::end 文件末尾
istream &seekg(pos_type position );
功能:通过 绝对位置 设置输入流位置指针的位置
ostream &seekp( off_type offset,ios::seekdir origin );
ostream &seekp( pos_type position );
功能与seekg类似,用哪个都可以
pos_type tellg();
功能:获取输入流的位置指针的位置
pos_type tellp();
功能:获取输出流的位置指针的位置
bool eof();
功能:判断文件的上一次读操作是否从文件末尾开始读,是返回真