文件类型分为两种
特点 | 文本文件 | 二进制文件 |
---|---|---|
数据表示 | 以可读文本形式存储,使用字符编码表示 | 以二进制形式存储,没有字符编码 |
可读性 | 人类可读 | 通常不是人类可读,包含未经编码的二进制数据 |
数据处理 | 用于文本处理,执行搜索、替换、分割、解析等文本操作 | 需要专门的处理方式,需要了解文件的格式和数据结构 |
文件格式 | 以明文格式存储,字符可见,通常以文本编码的头部信息开始 | 可以采用各种格式,通常没有文件开头的字符编码信息 |
操作文件的三大类
文件流类 | 描述 | 主要用途 |
---|---|---|
ifstream | 输入文件流,用于从文件中读取数据。 | 读取文件中的数据,通常用于文本文件。 |
ofstream | 输出文件流,用于向文件中写入数据。 | 写入数据到文件中,通常用于文本文件。 |
fstream | 文件流,同时具有输入和输出功能,可读可写。 | 既能读取文件中的数据,又能写入数据到文件中。 |
ifstream
输入文件流
ifstream(const char* filename, ios_base::openmode mode = ios_base::in);
功能:
- 文件读取:
ifstream
主要用于从文件中读取数据。你可以使用>>
运算符或getline
函数来读取文件的内容。 - 文件打开:使用
ifstream
对象打开目标文件。它接受文件名作为参数,并尝试打开该文件以进行读取操作。 - 错误处理:
ifstream
提供了错误处理机制,你可以检查是否发生了读取错误,以采取适当的措施。
主要构造函数参数:
ifstream
的主要构造函数参数是文件名和文件打开模式:
filename
:要读取的文件的名称,以 C 字符串形式表示。可以是相对路径或绝对路径。mode
:文件打开模式用于指定文件的操作方式。下面是一些常见的文件打开模式选项:ios_base::in
:输入模式,用于读取文件。ios_base::binary
:二进制模式,用于处理二进制文件。在二进制模式下,不会执行文本格式转换。- 其他模式:还有其他一些模式选项,如
ios_base::ate
(初始位置在文件末尾)等。
示例
ifstream
类提供了多种方式来读取文件中的数据,具体取决于你要读取的数据类型和文件内容的格式。以下是几种常见的方式:
-
逐行读取文本文件:
使用
getline
函数逐行读取文本文件的内容。ifstream inputFile("example.txt"); string line; while (getline(inputFile, line)) { // 处理每一行的内容 }
-
逐个字符读取文本文件:
使用
get
函数逐个字符读取文本文件的内容。ifstream inputFile("example.txt"); char ch; while (inputFile.get(ch)) { // 处理每个字符 }
-
使用
>>
运算符读取单词或数字:使用
>>
运算符可以从文本文件中逐个单词或数字。ifstream inputFile("numbers.txt"); int number; while (inputFile >> number) { // 处理每个数字 }
-
二进制文件的读取:
如果要读取二进制文件,通常使用
read
函数来读取二进制数据。ifstream binaryFile("data.bin", ios::binary); char buffer[100]; binaryFile.read(buffer, sizeof(buffer));
-
按特定格式解析文件内容:
如果文件包含自定义格式的数据,你可以使用字符串处理函数和其他方法按特定格式解析文件内容。
ifstream inputFile("data.txt"); string data; while (getline(inputFile, data)) { // 根据特定格式解析 data }
无论你选择哪种方式,都应根据文件的内容和格式来选择最适合的方法。 ifstream
提供了多种方法来读取不同类型和格式的文件内容。
ofstream
输出文件流
ofstream(const char* filename, ios_base::openmode mode = ios_base::out);
功能:
文件写入:ofstream
主要用于将数据写入文件。你可以使用 <<
运算符将文本、数字、变量等写入文件。
- 文件创建:如果指定的文件不存在,
ofstream
将自动创建文件。如果文件已存在,将会被覆盖(默认行为),或者你可以选择追加模式以在文件末尾添加数据。 - 文本文件和二进制文件:
ofstream
可以用于创建和写入文本文件和二进制文件。通过选择不同的打开模式,你可以指定是文本模式还是二进制模式。 - 错误处理:
ofstream
提供了错误处理机制,你可以检查是否发生了写入错误,以采取适当的措施。
主要构造函数参数:
ofstream
的主要构造函数参数是文件名和文件打开模式:
filename
:要写入的文件的名称,以 C 字符串形式表示。可以是相对路径或绝对路径。mode
:文件打开模式用于指定文件的操作方式。下面是一些常见的文件打开模式选项:ios_base::out
:输出模式,用于写入文件。如果文件不存在,将会创建它。如果文件已存在,将会被覆盖。ios_base::app
:追加模式,用于在文件末尾添加数据,而不是覆盖文件。ios_base::binary
:二进制模式,用于处理二进制文件。在二进制模式下,不会执行文本格式转换。- 其他模式:还有其他一些模式选项,如
ios_base::trunc
(截断模式,用于清空文件内容),ios_base::ate
(初始位置在文件末尾)等。
示例
使用 ofstream
类可以以多种方式写文件,具体取决于你要写入的数据类型和文件内容的格式。以下是几种常见的方式:
-
逐行写入文本文件:
使用
<<
运算符将文本数据逐行写入文本文件。ofstream outputFile("output.txt"); if (outputFile.is_open()) { outputFile << "这是要写入文件的文本数据。\n"; outputFile << "更多文本数据。\n"; outputFile.close(); // 关闭文件 }
-
逐个字符写入文本文件:
使用
put
函数逐个字符写入文本文件。ofstream outputFile("output.txt"); if (outputFile.is_open()) { char ch = 'A'; outputFile.put(ch); outputFile.put('B'); outputFile.close(); // 关闭文件 }
-
使用
<<
运算符写入文本数据:可以使用
<<
运算符写入各种数据类型,如整数、浮点数、字符串等。ofstream outputFile("numbers.txt"); if (outputFile.is_open()) { int number = 42; double pi = 3.14159; string text = "Hello, World!"; outputFile << "整数: " << number << ", 浮点数: " << pi << ", 字符串: " << text << endl; outputFile.close(); // 关闭文件 }
-
二进制文件的写入:
如果要写入二进制文件,使用
write
函数以二进制方式写入数据。ofstream binaryFile("data.bin", ios::binary); char buffer[] = "Binary Data"; binaryFile.write(buffer, sizeof(buffer)); binaryFile.close(); // 关闭文件
-
以特定格式写入文件内容:
如果需要按特定格式将数据写入文件,可以使用字符串处理函数和流操作符
<<
来构建适当格式的文本。ofstream outputFile("data.txt"); if (outputFile.is_open()) { int id = 123; string name = "Alice"; int age = 25; outputFile << id << " " << name << " " << age << endl; // 更多数据写入操作 outputFile.close(); // 关闭文件 }
这些是 ofstream
写文件的一些常见方式。你可以根据文件的内容和格式选择最适合的方法来执行文件写入操作。
fstream
文件流
fstream(const char* filename, ios_base::openmode mode = ios_base::in | ios_base::out);
功能:
- 文件读取和写入:
fstream
可以用于从文件中读取数据,同时也可以将数据写入文件。这使得它在需要同时读取和写入文件内容的情况下非常有用。 - 文件打开:使用
fstream
对象打开目标文件。它接受文件名作为参数,并尝试打开该文件以进行读取和写入操作。 - 错误处理:
fstream
提供了错误处理机制,你可以检查是否发生了读取或写入错误,以采取适当的措施。
主要构造函数参数:
fstream
的主要构造函数参数是文件名和文件打开模式:
filename
:要读取和写入的文件的名称,以 C 字符串形式表示。可以是相对路径或绝对路径。mode
:文件打开模式用于指定文件的操作方式。下面是一些常见的文件打开模式选项:ios_base::in
:输入模式,用于读取文件。ios_base::out
:输出模式,用于写入文件。如果文件不存在,将会创建它。如果文件已存在,将会被覆盖。ios_base::app
:追加模式,用于在文件末尾添加数据,而不是覆盖文件。ios_base::binary
:二进制模式,用于处理二进制文件。在二进制模式下,不会执行文本格式转换。- 其他模式:还有其他一些模式选项,如
ios_base::ate
(初始位置在文件末尾)等。
示例
fstream
是C++标准库中的文件流类,允许你执行文件的读取和写入操作。它具有同时支持输入和输出的功能,因此可以用于读写文件。以下是 fstream
的一些常见用法示例:
-
创建文件并写入数据:
#include <iostream> #include <fstream> using namespace std; int main() { fstream file("output.txt", ios_base::out); if (file.is_open()) { file << "这是要写入文件的文本数据。\n"; file << "更多文本数据。\n"; file.close(); // 关闭文件 cout << "文件写入完成。\n"; } else { cerr << "无法打开文件。\n"; } return 0; }
在此示例中,我们使用
fstream
创建文件 “output.txt” 并写入文本数据。 -
读取文件内容并处理:
#include <iostream> #include <fstream> using namespace std; int main() { fstream file("data.txt", ios_base::in); if (file.is_open()) { int number; while (file >> number) { cout << "从文件中读取的数据: " << number << endl; } file.close(); // 关闭文件 } else { cerr << "无法打开文件。\n"; } return 0; }
这个示例中,我们使用
fstream
打开文件 “data.txt” 并从中读取整数数据。 -
同时读取和写入文件:
#include <iostream> #include <fstream> using namespace std; int main() { fstream file("data.txt", ios_base::in | ios_base::out); if (file.is_open()) { int number; file >> number; cout << "从文件中读取的数据: " << number << endl; // 在文件末尾添加新数据 int newNumber = number * 2; file.seekp(0, ios::end); // 定位到文件末尾 file << newNumber; file.close(); // 关闭文件 } else { cerr << "无法打开文件。\n"; } return 0; }
这个示例演示了如何使用
fstream
同时读取和写入文件内容。 -
使用二进制文件:
#include <iostream> #include <fstream> using namespace std; struct Data { int number; double value; }; int main() { fstream binaryFile("data.bin", ios_base::in | ios_base::out | ios_base::binary); if (binaryFile.is_open()) { Data data; // 从二进制文件中读取数据 binaryFile.read(reinterpret_cast<char*>(&data), sizeof(Data)); cout << "从二进制文件中读取的数据: " << data.number << ", " << data.value << endl; // 写入新数据到二进制文件 data.number = 42; data.value = 3.14159; binaryFile.seekp(0, ios::beg); // 定位到文件开头 binaryFile.write(reinterpret_cast<const char*>(&data), sizeof(Data)); binaryFile.close(); // 关闭文件 } else { cerr << "无法打开二进制文件。\n"; } return 0; }
这个示例演示了如何使用
fstream
读写二进制文件中的数据。
fstream
提供了灵活的方式来操作文件,无论是读取还是写入,以及文本文件或二进制文件。根据需要,你可以选择不同的打开模式,以满足特定的文件操作需求。