基本概念
文本文件和二进制文件是计算机中存储数据的两种基本方式:
- 文本文件:以 ASCII 或 Unicode 等字符编码方式存储,内容可以直接被人类读取。
- 二进制文件:以原始二进制格式存储数据,通常需要特定程序才能解析。
主要区别
特性 | 文本文件 | 二进制文件 |
---|---|---|
存储格式 | 字符编码(ASCII/Unicode) | 原始二进制数据 |
可读性 | 人类可读 | 人类不可读(乱码) |
数据处理 | 逐行 / 逐字符处理 | 按固定大小的数据块处理 |
存储效率 | 较低(需编码转换) | 较高(直接存储原始数据) |
跨平台兼容性 | 可能存在换行符差异(\r\n/\n) | 二进制格式需一致才能跨平台 |
典型应用 | 配置文件、日志、源代码 | 图像、音频、数据库文件 |
C++ 代码示例
下面的 C++ 代码演示了如何使用文本模式和二进制模式读写文件:
file_io_example.cpp
cpp
// 文件读写示例:文本模式与二进制模式对比
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
// 文本模式读写示例
void textFileExample() {
// 写入文本文件
std::ofstream textOut("text_file.txt");
if (textOut.is_open()) {
textOut << "Hello, World!\n";
textOut << "123\n";
textOut << "3.14\n";
textOut.close();
std::cout << "文本文件写入成功!\n";
}
// 读取文本文件
std::ifstream textIn("text_file.txt");
if (textIn.is_open()) {
std::string line;
while (std::getline(textIn, line)) {
std::cout << "读取文本行: " << line << std::endl;
}
textIn.close();
}
}
// 二进制模式读写示例
void binaryFileExample() {
// 写入二进制文件
std::ofstream binaryOut("binary_file.bin", std::ios::binary);
if (binaryOut.is_open()) {
// 写入字符串
std::string str = "Hello, World!";
size_t strLen = str.length();
binaryOut.write(reinterpret_cast<const char*>(&strLen), sizeof(strLen));
binaryOut.write(str.c_str(), strLen);
// 写入整数
int num = 123;
binaryOut.write(reinterpret_cast<const char*>(&num), sizeof(num));
// 写入浮点数
double dbl = 3.14;
binaryOut.write(reinterpret_cast<const char*>(&dbl), sizeof(dbl));
binaryOut.close();
std::cout << "二进制文件写入成功!\n";
}
// 读取二进制文件
std::ifstream binaryIn("binary_file.bin", std::ios::binary);
if (binaryIn.is_open()) {
// 读取字符串
size_t readStrLen;
binaryIn.read(reinterpret_cast<char*>(&readStrLen), sizeof(readStrLen));
std::vector<char> buffer(readStrLen);
binaryIn.read(buffer.data(), readStrLen);
std::string readStr(buffer.begin(), buffer.end());
// 读取整数
int readNum;
binaryIn.read(reinterpret_cast<char*>(&readNum), sizeof(readNum));
// 读取浮点数
double readDbl;
binaryIn.read(reinterpret_cast<char*>(&readDbl), sizeof(readDbl));
std::cout << "读取二进制数据:\n";
std::cout << "字符串: " << readStr << std::endl;
std::cout << "整数: " << readNum << std::endl;
std::cout << "浮点数: " << readDbl << std::endl;
binaryIn.close();
}
}
int main() {
std::cout << "=== 文本文件示例 ===\n";
textFileExample();
std::cout << "\n=== 二进制文件示例 ===\n";
binaryFileExample();
return 0;
}
代码说明
上面的代码展示了:
-
文本文件操作:
- 使用
std::ofstream
和std::ifstream
的默认模式(文本模式) - 使用
<<
和>>
操作符或getline()
进行读写 - 数据会自动进行字符编码转换
- 使用
-
二进制文件操作:
- 通过
std::ios::binary
标志指定二进制模式 - 使用
write()
和read()
方法直接读写内存中的数据 - 需要手动管理数据的大小和格式
- 通过
注意事项
-
二进制文件的可移植性:
- 不同平台的字节序(大端 / 小端)可能不同
- 浮点数表示方式可能有差异
- 结构体对齐方式可能不同
-
文本文件的平台差异:
- Windows 使用
\r\n
作为换行符,Unix/Linux 使用\n
- 在 Windows 上,文本模式写入时会自动将
\n
转换为\r\n
- Windows 使用
-
选择原则:
- 需要人类可读或跨平台兼容性时使用文本文件
- 需要高效存储或直接访问内存数据时使用二进制文件
根据具体应用场景选择合适的文件类型,能显著提升程序的性能和可维护性。