在完成对C语言的学习后,我最近开始了对C++和Java的学习,目前跟着视频学习了一些语法,也跟着敲了一些代码,有了一定的掌握程度。现在将跟着视频做的笔记进行整理。本篇博客是整理C++知识点的第十七篇博客。
本篇博客介绍了C++的文件操作。
本系列博客所有C++代码都在Visual Studio 2022环境下编译运行。程序为64位。
目录
文件操作
文件操作简介
程序运行时产生的数据都是临时的,程序运行结束后都会释放。通过程序与文件的交互可以使数据持久化。
C++中文件操作需要包含头文件fstream。
文件类型分为两种,文本文件和二进制文件。
文本文件以文本的ASCII码形式存储在计算机中。二进制文件以文本的二进制形式存储在计算机中,一般不能直接读懂。
操作文件分为三大类,ofstream表示写操作,ifstream表示读操作,fstream表示读写操作。
文本文件写文件
写文件需要创建一个ofstream的流对象。随后用这个对象的open函数,格式是流对象名.open("文件路径",打开方式)。
打开文件后可以写文件,格式是流对象名 << "写入的数据"。
在完成所有对文件的操作后,需要关闭文件,格式是流对象名.close()。
ios::in表示为读文件而打开文件。ios::out表示为写文件而打开文件。ios::ate将初始位置放在文件尾。ios::app以追加的方式写文件。ios::trunc表示如果文件存在,先删除再创建。ios::binary表示二进制形式读写。
文件打开方式可以通过利用|操作配合使用。
#include<iostream>
#include<fstream>
using namespace std;
int main(void)
{
ofstream ofs;
ofs.open("test.txt", ios::out);
ofs << "Hello world" << endl;
ofs << "Hello C++" << endl;
ofs.close();
return 0;
}
这段代码将Hello world和Hello C++写入test.txt文件中。程序控制台无输出。文件test.txt的内容是:
Hello world
Hello C++
文本文件读文件
文本文件读文件需要创建ifstream的流对象。
需要读文件时,在打开文件后通常需要判断是否打开成功,用流对象的is_open函数判断,true为成功,false为失败。
读文件最后也需要关闭文件。
读文件有四种方式。下面一一表示。
可以创建一个char类型数组,然后通过流对象 >> 数组名的方式读入。这种方式遇到空格,换行等会停止读入,可以通过while循环令其一直读入,只要不到文件末尾则一直为true。
#include<iostream>
#include<fstream>
using namespace std;
int main(void)
{
ifstream ifs;
ifs.open("test.txt", ios::in);
if (!ifs.is_open()) {
cout << "ERROR" << endl;
return 1;
}
char ch[1000];
while (ifs >> ch) {
cout << ch << endl;
}
ifs.close();
return 0;
}
这段代码创建了char类型的数组ch,并且只要不到文件末尾就一直读入,读后在循环内输出。
程序的输出是:
Hello
world
Hello
C++
文件内容就是上面写入的内容,没有修改。
也可以通过流对象的getline函数进行读文件操作。该函数有两个参数,第一个是一个char类型指针,第二个是第一个参数的大小。一次读取一行内容,并且在不到文件末尾时,结果都是true。
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
int main(void)
{
ifstream ifs;
ifs.open("test.txt", ios::in);
if (!ifs.is_open()) {
cout << "ERROR" << endl;
return 1;
}
char ch[1000];
while (ifs.getline(ch, sizeof(ch))) {
cout << ch << endl;
}
ifs.close();
return 0;
}
这段代码创建了一个char类型数组ch。然后进行while循环,只要不到文件末尾就一直用getline进行读入,随后在循环体中进行输出。
程序的输出是:
Hello world
Hello C++
文件内容就是上面写入的内容,没有修改。
string头文件的函数getline也可以进行读入,有两个参数,第一个是一个ifstream流对象,第二个是一个string类型对象。如果不到文件末尾则结果为true。
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
int main(void)
{
ifstream ifs;
ifs.open("test.txt", ios::in);
if (!ifs.is_open()) {
cout << "ERROR" << endl;
return 1;
}
string str;
while (getline(ifs, str)) {
cout << str << endl;
}
ifs.close();
return 0;
}
程序中使用while循环进行读入,在循环体内输出。
程序的结果是:
Hello world
Hello C++
文件内容就是上面写入的内容,没有修改。
ifstream流对象有一个没有参数的get函数,读取下一个字符,并将其结果返回。如果到达文件结尾,则返回EOF。EOF表示文件结尾。
#include<iostream>
#include<fstream>
using namespace std;
int main(void)
{
ifstream ifs;
ifs.open("test.txt", ios::in);
if (!ifs.is_open()) {
cout << "ERROR" << endl;
return 1;
}
char ch;
while ((ch = (ifs.get())) != EOF){
cout << ch;
}
ifs.close();
return 0;
}
程序创建了一个char类型变量ch,随后使用while循环进行不断读入,至文件末尾为止。循环体内输出ch。程序的结果是:
Hello world
Hello C++
文件内容就是上面写入的内容,没有修改。
二进制文件写文件
二进制文件读写操作都要指定ios::binary。
二进制文件写文件主要用流对象调用成员函数write,write函数的原型是:
ostream& write (const char * buffer,int len)
buffer指向内存的一块空间,len是读写的字节数量。
#include<iostream>
#include<fstream>
using namespace std;
class person {
public:
char name[20];
int age;
};
int main(void)
{
ofstream ofs;
ofs.open("testbinary.txt", ios::binary | ios::out);
person p = { "Linda",24 };
ofs.write((const char*)&p, sizeof(p));
ofs.close();
return 0;
}
程序中有person类,其成员为一个char类型数组和一个int类型变量。(这里处理字符串时不要用string,因为string的一些特性会造成问题)程序创建了一个person类对象p,并将其写入文件。写的时候将地址强制类型转换成了const char类型。
程序无输出,文件中有内容(但是无法读懂)。
二进制文件读文件
二进制读文件主要调用成员函数read。函数原型是:
istream& read(char *buffer,int len)
buffer指向一块空间,len是读入的字节数。
#include<iostream>
#include<fstream>
using namespace std;
class person
{
public:
char name[20];
int age;
};
int main(void)
{
ifstream ifs;
ifs.open("testbinary.txt", ios::binary | ios::in);
if (!ifs.is_open()) {
cout << "ERROR" << endl;
return 1;
}
person p;
ifs.read((char*)&p, sizeof(p));
cout << "The name is " << p.name << endl;
cout << "The age is " << p.age << endl;
ifs.close();
return 0;
}
程序创建了一个person类和一个类对象。随后读入数据并进行输出。在读入时将指针强制转换为char*类型。
程序的输出是:
The name is Linda
The age is 24
类的内容和上面读入的一致。