C++学习练习
之文件操作
程序运行时产生的数据都属于临时数据,程序一旦运行结束,都会被释放。
通过文件可以将数据持久化。
C++中对文件操作需要包含头文件 < fstream >
文件类型分为两种:
1、文本文件:文件以文本的ASCII码形式存储在计算机中。
2、二进制文件:文件以文本的二进制形式存储在计算机中,用户一般不能直接读懂它们。
操作文件的三大类:
1、ofstream 写操作
2、ifstream 读操作
3、fstream 读写操作
一、文本文件
1、写文件
写文件步骤:
1、包含头文件 : < fstream>
2、创建流对象 : ofstream ofs;
3、打开文件 : ofs.open(“文件路径”,打开方式);
4、写数据 : ofs << “写入的数据”;
5、关闭文件: ofs.close();
文件打开方式:
打开方式 |
解释 |
ios::in |
为读文件而打开文件 |
ios::out |
为写文件而打开文件 |
ios::ate |
初始位置:文件尾 |
ios::app |
追加方式写文件 |
ios::trunc |
如果文件存在,先删除,再创建 |
ios::binary |
二进制方式 |
注意:文件打开方式可以配合使用,利用 | 操作符。
例如:用二进制方式写文件:’ ios::out | ios::binary ’
代码如下:
#include <iostream>
using namespace std;
#include <fstream>
//文本文件 写文件
void test01(){
//1、包含头文件 fstream
//2、创建流对象
ofstream ofs;
//3、指定打开方式
ofs.open("data.txt",ios::out);
//4、写内容
ofs << "姓名:达拉崩吧斑得贝迪卜多比鲁翁" << endl;
ofs << "性别:男" << endl;
ofs << "年龄:18" << endl;
//5、关闭文件
ofs.close();
}
int main(){
test01();
system("pause");
return 0;
}
其中, ofs.open(“data.txt”,ios::out); 如果文件路径可以是绝对路径和相对路径,这里用的是相对路径,运行完毕后,会在该代码路径下创建一个 data.txt 文件。
2、读文件
读文件步骤:
1、包含头文件 : < fstream>
2、创建流对象 : ifstream ifs;
3、打开文件并判断文件是否打开成功 : ifs.open(“文件路径”,打开方式);
4、读数据 : 四种方式读取(代码中体现)
5、关闭文件: ofs.close();
代码如下:
#include <iostream>
using namespace std;
#include <fstream>
#include <string>
//文本文件 读文件
void test01(){
//1、包含头文件
//2、创建流对象
ifstream ifs;
//3、打开文件 并且判断是否打开成功
ifs.open("data.txt",ios::in);
if(!ifs.is_open()){
cout << "文件打开失败" << endl;
return;
}
//4、读数据
//第一种
// char buff[1024] = {0};
// while (ifs >> buff){
// cout << buff << endl;
// }
//第二种
// char buff[1024] = {0};
// while (ifs.getline(buff,sizeof(buff))){
// cout << buff << endl;
// }
//第三种
// string buff;
// while(getline(ifs,buff)){
// cout << buff << endl;
// }
//第四种
char c;
while ((c = ifs.get()) != EOF){ //EOF end of file
cout << c;
}
//5、关闭文件
ifs.close();
}
int main(){
test01();
system("pause");
return 0;
}
读文件的方式:
第一种:创建一个字符数组,初始化全为0.然后在while循环里将ifs中的数据利用右移运算符(<<)移到数组中。当(ifs >> buff)一行一行读到头之后会返回一个假的信息,结束循环。最后输出buff。
第二种:同样创建字符数组。利用ifs中的成员函数 ifs.getline(buff,sizeof(buff))1 一行一行获取数据存入到buff中。
第三种:利用string容器保存ifs的数据,利用全局函数getline(ifs,buff)2,将数据保存到buff中。
第四种:创建一个字符c,通过ifs中的get()方法,把字符读到c中,通过
((c = ifs.get()) != EOF) 判断有没有读到没见尾,然后,输出c
二、二进制文件
1、写文件
二进制方式写文件主要利用流对象调用成员函数write
函数原型:
ostream& write(const char * buffer,int len);
参数解释:字符指针buffer指向内存中一段存储空间,len是读写的字节数
代码如下:
#include <iostream>
using namespace std;
#include <fstream>
//二进制文件 写文件
class Person{
public:
char m_Name[64]; //姓名
int m_Age; //年龄
};
void test01(){
//1、包含头文件
//2、创建流对象
ofstream ofs("Person.txt",ios::out | ios::binary);
//3、打开文件
// ofs.open("Person.txt",ios::out | ios::binary);
//4、写文件
Person p = {"张三", 18};
ofs.write((const char *)&p, sizeof(Person));
//5、关闭文件
ofs.close();
}
int main(){
test01();
system("pause");
return 0;
}
2、读文件
二进制方式写文件主要利用流对象调用成员函数read
函数原型:
istream& read(const char * buffer,int len);
参数解释:字符指针buffer指向内存中一段存储空间,len是读写的字节数
代码如下:
#include <iostream>
using namespace std;
#include <fstream>
//二进制文件 读文件
class Person{
public:
char m_Name[64]; //姓名
int m_Age; //年龄
};
void test01(){
//1、包含头文件
//2、创建流对象
ifstream ifs;
//3、打开文件 并且判断是否打开成功
ifs.open("Person.txt",ios::in | ios::binary);
if(!ifs.is_open()){
cout << "文件打开失败" << endl;
return;
}
// 4、读数据
Person p;
ifs.read((char *)&p,sizeof(Person));
cout << "姓名:" << p.m_Name << " 年龄:" << p.m_Age << endl;
//5、关闭文件
ifs.close();
}
int main(){
test01();
system("pause");
return 0;
}
三、学习资源
学习资源
https://www.bilibili.com/video/BV1et411b73Z?p=143
-
成员函数getline(char* _Str,std::streamsize_Count)
-
全局函数getline(basic_istream<_CharT, _Traits>& __is,
basic_string<_CharT, _Traits, _Alloc>& __str)
说白了第一个参数就是输入流,第二个参数就是准备好的字符串。