C++学习笔记(七)——文件操作
写在前面
写本系列的目的(自用)是回顾已经学过的知识、记录新学习的知识或是记录心得理解,方便自己以后快速复习,减少遗忘。以前三天打鱼两天晒网地学习C++,一直无法对C++熟练掌握,核心的面向对象编程并不熟悉,STL语法只会部分,因此也希望自己未来能做到熟悉甚至精通C++。
Part 3 文件操作
该部分主要通过b站黑马程序员的视频来进行学习,记录笔记。全部是概念性的东西并不能帮助理解知识,直接上代码并以注释的形式讲解会更易于理解。另外,很多繁琐的东西并不能一次性记住,在遇到的时候多查多用才能融会贯通。
一、文本文件
程序运行时产生的数据都属于临时数据,程序一旦运行结束都会被释放。通过文件可以将数据持久化。
C++中队对文件操作需要包含头文件<fstream>。文件分两种类型,文本文件和二进制文件:
1、文本文件::文件以文本的ASCII码形式存储在计算机中
2、二进制文件:文件以文本的二进制形式存储在计算机中,用户一般不能直接读懂它们
操作文件的三大类:
1、ofstream:写操作
2、ifstream:读操作
3、fstream:读写操作
1、写文件
(1)写文件的步骤
1、包含头文件:#include<fstream>
2、创建流对象:ofstream ofs;
3、打开文件:ofs.open("文件路径", 打开方式)
4、写数据:ofs<<"写入的数据"
5、关闭文件:ofs.close();
(2)文件打开的方式
1、ios::in 为读文件而打开的文件
2、ios::out 为写文件而打开文件
3、ios::ate 初始位置:文件尾,这样可以把内容直接追加到文件尾
4、ios::app 追加方式写文件,也是直接跑到文件尾写
5、ios::trunc 如果文件存在先删除,再创建
6、ios::binary 二进制方式
文件打开方式可以配合使用,利用 | 操作符
(3)文本文件中的写文件
下面看一个示例:
#include<iostream>
#include<fstream>
using namespace std;
void test()
{
ofstream ofs; //创建流对象
ofs.open("test.txt", ios::out); //文件打开方式,写文件
ofs << "Hello World!" << endl; //在文件里写内容
ofs << "Hello files!" << endl;
ofs.close(); //关闭文件
}
int main()
{
test();
system("pause");
return 0;
}
运行完就会在你的代码同文件夹下产生一个txt文件。
2、读文件
(1)读文件的步骤
1、包含头文件:#include<fstream>
2、创建流对象:ifstream ifs;
3、打开文件并判断文件是否打开成功:ifs.open("文件路径", 打开方式);
4、读数据:共有四种方式进行读取
5、关闭文件:ifs.close();
(2)文本文件中的读文件
由于读文件有四种方式,所以用注释展示。四种方式只需要记住一种就可以,推荐前三种。
这里先介绍一下getline()函数的用法。getline()函数有两种用法,分别适用于不同的场景:
1、读取C风格的字符串:属于<istream>头文件,语法为:
istream& getline(char* buffer, streamsize count, char delim = '\n');
其中,buffer存储读取结果的字符数组(C风格);count是最大读取长度,包括终止符,实际最多读count-1个字符;delim是终止符,通常默认是换行符'\n',遇到该字符时终止读取。在文件示例中方法一就是该方法的getline函数。
2、读取C++字符串,属于<string>头文件,语法为:
istream& getline(istream& is, string& str, char delim = '\n');
其中,is是输入流,如cin、ifstream;str存储结果的string对象,无需提前指定大小,自动扩容。delim是终止符,默认换行符‘\n’。getline()可以读取一整行数据,而不像cin一样会被空格打断。
现在给一个cin的示例,ifstream的示例见文件的示例。
string line;
cout<<"请输入一行带空格的文本";
getline(cin, line);
cout<<"你输入的是"<<line<<endl;
下面是读文件的示例:
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
void test1()
{
ifstream ifs; //创建流对象
ifs.open("test.txt", ios::in); //打开文件,以读方式
if (!ifs.is_open()) //判断是否打开成功
{
cout << "文件打开失败!" << endl;
return;
}
//读数据,第一种方式
/*
char buf[1024] = { 0 };
while (ifs >> buf) {
cout << buf << endl;
}
*/
//第二种方式
/*
char buf[1024] = { 0 };
while (ifs.getline(buf, sizeof(buf)))
{
cout << buf << endl;
}
*/
//第三种方法
/*
string buf;
while (getline(ifs, buf))
{
cout << buf << endl;
}
*/
//第四种方法
char c;
while ((c = ifs.get()) != EOF) {
cout << c;
}
ifs.close(); //关闭文件
}
int main()
{
test1();
system("pause");
return 0;
}
二、二进制文件
以二进制的方式对文件进行读写操作。打开方式要指定为ios::binary
1、写文件
二进制方式写文件主要利用流对象调用成员函数write
函数原型:ostream &write(const char* buffer, int len);
其中,buffer指向内存中的一段存储空间,len是读写的字节数。下面来看示例:
#include<iostream>
#include<fstream>
using namespace std;
class Person
{
public:
char m_Name[64];
int m_Age;
};
void test1()
{
//ofstream ofs; 这两句其实可以合并为一句
//ofs.open("person.txt", ios::out | ios::binary); //打开文件
ofstream ofs("person.txt", ios::out | ios::binary); /二进制型输出,这是文件的打开方式
Person p = { "Alice", 18 };
ofs.write((const char*)&p, sizeof(Person)); //注意这里的写法,(const char*)&p是规定的
//读取格式,由于p的地址并不是const char*型的所以要强转
ofs.close();
}
int main()
{
test1();
system("pause");
return 0;
}
2、读文件
二进制方式读文件用的是read。
函数原型:istream &read(char *buffer, int len)
其中,buffer指向内存中的一段存储空间,len是读写的字节数。
以下是读文件案例:
#include<iostream>
#include<fstream>
using namespace std;
class Person
{
public:
char m_Name[64];
int m_Age;
};
void test1()
{
ifstream ifs;
ifs.open("Person.txt", ios::in | ios::binary);
if (!ifs.is_open())
{
cout << "文件打开失败" << endl;
return;
}
Person p;
ifs.read((char*)&p, sizeof(Person));
cout << p.m_Name << " " << p.m_Age << endl;
ifs.close();
}
int main()
{
test1();
system("pause");
return 0;
}更多推荐
所有评论(0)