C++ 文件操作实战:文本文件与二进制文件的读写
在C++编程中,文件操作是一项非常重要的技能,无论是处理用户数据、配置文件还是日志记录,都离不开对文件的读写操作。本文将通过一个实际的项目案例,详细介绍C++中如何实现文本文件和二进制文件的读写操作。我们将从代码实现的角度,逐步解析每一个功能模块的设计思路和实现细节。
项目背景
在实际开发中,我们经常需要对文件进行读写操作。文本文件通常用于存储可读的文本数据,如日志、配置文件等;而二进制文件则用于存储结构化的数据,如程序的配置信息、用户数据等。本文的项目将展示如何通过C++实现以下功能:
-
写入文本文件:将一些基本信息写入文本文件。
-
读取文本文件:以多种方式读取文本文件的内容。
-
写入二进制文件:将结构化的数据以二进制形式写入文件。
-
读取二进制文件:从二进制文件中读取数据并还原为原始结构。
项目结构
本项目包含以下几个文件:
-
me.h
:头文件,声明了各个功能函数。 -
main.cpp
:主程序文件,调用各个功能函数。 -
写文本文件.cpp
:实现文本文件的写入功能。 -
读文本文件.cpp
:实现文本文件的读取功能。 -
写二进制文件.cpp
:实现二进制文件的写入功能。 -
读二进制文件.cpp
:实现二进制文件的读取功能。
1. 写入文本文件
实现代码 (写文本文件.cpp
)
cpp复制
#include <iostream>
#include <fstream>
using namespace std;
void test1()
{
ofstream ofs; // 创建写文件类
ofs.open("test.txt", ios::out); // 打开文件,指定为文本写入模式
ofs << "姓名:张三" << endl; // 写入文本内容
ofs << "性别:未知" << endl;
ofs << "年龄:未知" << endl;
ofs.close(); // 关闭文件
}
功能解析
-
使用
ofstream
类创建一个文件输出流对象ofs
。 -
调用
open
方法打开文件,指定文件名和打开模式(ios::out
表示文本写入模式)。 -
使用
<<
运算符将字符串写入文件。 -
调用
close
方法关闭文件,确保数据被正确写入并释放资源。
2. 读取文本文件
实现代码 (读文本文件.cpp
)
cpp复制
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
void test2(int a)
{
ifstream ifs; // 创建文件输入流对象
ifs.open("test.txt", ios::in); // 打开文件,指定为文本读取模式
if (!ifs.is_open()) // 判断文件是否成功打开
{
cout << "打开失败" << endl;
return;
}
switch (a)
{
case 1: // 单字符读入
{
cout << "读文件方式1:单字符读入" << endl;
char c = '0';
while ((c = ifs.get()) != EOF) // 使用get方法逐字符读取
{
cout << c;
}
break;
}
case 2: // 单字符写入buf
{
cout << "读文件方式2:单字符写入buf" << endl;
char buf[1024] = {0};
while (ifs >> buf) // 使用>>运算符读取单词
{
cout << buf << endl;
}
break;
}
case 3: // 单行写入buf
{
cout << "读文件方式3:单行写入buf,语法1,推荐使用" << endl;
char buf[1024] = {0};
while (ifs.getline(buf, sizeof(buf))) // 使用getline方法读取整行
{
cout << buf << endl;
}
break;
}
case 4: // 单行写入buf,语法2
{
cout << "读文件方式4:单行写入buf,语法2" << endl;
string buf;
while (getline(ifs, buf)) // 使用getline方法读取整行
{
cout << buf << endl;
}
break;
}
default:
cout << "输入错误" << endl;
break;
}
ifs.close(); // 关闭文件
}
功能解析
-
使用
ifstream
类创建一个文件输入流对象ifs
。 -
调用
open
方法打开文件,指定文件名和打开模式(ios::in
表示文本读取模式)。 -
根据传入的参数
a
,选择不同的读取方式:-
单字符读入:使用
get
方法逐字符读取。 -
单字符写入buf:使用
>>
运算符读取单词。 -
单行写入buf:使用
getline
方法读取整行。 -
单行写入buf(语法2):使用
getline
方法读取整行,使用string
类型作为缓冲区。
-
-
调用
close
方法关闭文件,确保资源被正确释放。
3. 写入二进制文件
实现代码 (写二进制文件.cpp
)
cpp复制
#include <iostream>
#include <fstream>
using namespace std;
class my_class
{
public:
char m_a[64]; // 使用C的char数组存储字符串
int m_b;
};
void test3()
{
ofstream ofs; // 创建文件输出流对象
ofs.open("my_class.txt", ios::out | ios::binary); // 打开文件,指定为二进制写入模式
my_class m1 = {"张三", 100}; // 初始化对象
ofs.write((const char*)&m1, sizeof(m1)); // 使用write方法写入二进制数据
ofs.close(); // 关闭文件
}
功能解析
-
定义一个
my_class
类,包含一个字符数组m_a
和一个整数m_b
。 -
使用
ofstream
类创建一个文件输出流对象ofs
。 -
调用
open
方法打开文件,指定文件名和打开模式(ios::out | ios::binary
表示二进制写入模式)。 -
使用
write
方法将对象m1
的二进制数据写入文件。write
方法的第一个参数是数据的地址,第二个参数是数据的大小。 -
调用
close
方法关闭文件,确保数据被正确写入并释放资源。
4. 读取二进制文件
实现代码 (读二进制文件.cpp
)
cpp复制
#include <iostream>
#include <fstream>
using namespace std;
class my_class
{
public:
char m_a[64];
int m_b;
};
void test4()
{
ifstream ifs; // 创建文件输入流对象
ifs.open("my_class.txt", ios::in | ios::binary); // 打开文件,指定为二进制读取模式
if (!ifs.is_open()) // 判断文件是否成功打开
{
cout << "打开失败" << endl;
return;
}
my_class m1 = {"0", 0}; // 初始化对象
ifs.read((char*)&m1, sizeof(m1)); // 使用read方法读取二进制数据
cout << m1.m_a << endl << m1.m_b << endl; // 输出读取到的数据
ifs.close(); // 关闭文件
}
功能解析
-
使用
ifstream
类创建一个文件输入流对象ifs
。 -
调用
open
方法打开文件,指定文件名和打开模式(ios::in | ios::binary
表示二进制读取模式)。 -
使用
read
方法将文件中的二进制数据读取到对象m1
中。read
方法的第一个参数是目标地址,第二个参数是数据的大小。 -
输出读取到的数据,验证读取是否成功。
-
调用
close
方法关闭文件,确保资源被正确释放。
总结
通过上述代码实现,我们详细介绍了C++中如何实现文本文件和二进制文件的读写操作。文本文件的读写操作相对简单,主要使用ofstream
和ifstream
类,结合<<
和>>
运算符以及getline
方法。二进制文件的读写操作则需要使用write
和read
方法,并确保数据的大小和地址正确。
在实际开发中,选择文本文件还是二进制文件取决于具体需求。文本文件适合存储可读的文本数据,便于调试和查看;二进制文件则适合存储结构化的数据,读写效率更高,但可读性较差。希望本文的介绍能帮助你更好地理解和掌握C++文件操作的技巧。
如果你对本文的内容有任何疑问或建议,欢迎在评论区留言,我们一起交流学习!