【C++第二阶段】文件操作

以下内容仅为当前认识,可能有不足之处,欢迎讨论!


文章目录


文件操作

文件写入流程

写文件包括以下几个步骤

1.包含头文件

2.创建流对象

3.打开文件,以指定方式

4.写入内容

5.关闭文件

1.头文件一般用

ofstream(写文件) ------从编译器中向文件写,故为output-file-stream,

ifstream(读文件)------从文件中向编译器读,故为in-file-stream,

fstream(读写文件)------从文件中可以读出数据,也可以将编译器中的数据写入文件,故为file-stream。

流对象一般用对应头文件的对象。

指定方式有表格,可以指定多种,用|来分割。

模式标志 描述
ios::app 追加模式。所有写入都追加到文件末尾
ios::ate 文件打开后定位到文件末尾
ios::in 打开文件用于读取
ios::out 打开文件用于写入
io::trunc 如果该文件已经存在,内容将在打开文件之前被截断,即把文件长度设置为0

写入内容是左移运算符

关闭文件一般是close()函数

简单的demo写操作

代码

cpp 复制代码
#include<iostream>
using namespace std;
#include<string>
#include<fstream>

void test0226_0() {
	/*
	写文件包括以下几个步骤
	1.包含头文件
	2.创建流对象
	3.打开文件,以指定方式
	4.写入内容
	5.关闭文件

	头文件一般用ofstream , ifstream , fstream
	流对象一般用对应头文件的对象
	指定方式有表格,可以指定多种,用|来分割
	写入内容是左移运算符
	关闭文件一般是close()函数
	*/
	//1.创建流对象
	fstream fs;
	//2.打开文件及指定打开方式
	fs.open("file.txt", ios::app);
	cout << "打开成功文件成功,对其写入数据." << endl;
	fs << "打开一个文件,对其写入" << endl;
	cout << "写入文件成功,关闭文件." << endl;
	fs.close();
	cout << "关闭文件成功." << endl;

	
}

int main() {
	cout << "hello ! world ! " << endl;
	test0226_0();
    system("pause");
    return 0;}

运行结果:

可以看到成功写入。

文件读流程

文件读流程有4种方式。

①通过右移运算符放入字符数组中;

cpp 复制代码
ifstream ifs;
ifs.open("file.txt",ios::in);
if (!ifs.is_open()){
    return;
}
char char_arry[1024]={0};
while (ifs>>char_array){
    cout<<char_array<<endl;
}
ifs.close();

②通过文件流对象自带的getline函数用字符数组逐行接收;

cpp 复制代码
ifstream ifs;
ifs.open("file.txt",ios::in);
if(!ifs.is_open()){
	return ;
}
char char_array[1024]={0};
while (ifs.getline(char_array,sizeof(char_array))){
    cout<<char_array<<endl;
}
ifs.close();

③通过string头文件自带的全局getline函数用string函数接收;

cpp 复制代码
ifstream ifs;
ifs.open("file.txt" , ios::in);
if(!ifs.is_open()){
    return ;
}
string array;
while(getline(ifs , array)){
    cout<<array<<endl;
}
ifs.close();

④通过文件流对象逐个读取字符打印。

cpp 复制代码
ifstream ifs;
ifs.open("file.txt" , ios::in);
if(!ifs.is_open()){
    return ;
}
char c;
while(c=ifs.get() && ifs.get()!= EOF){
    cout<<c<<endl;
}
ifs.close();

最后种方式我打印不出来。

二进制写文件

二进制方式对文件写入

函数原型:ostream & write(const char * buffer , int len);

参数解释:字符指针buffer指向内存中一段存储空间。len是读写的字节数。

二进制方式写文件主要利用流对象调用成员函数write。

在用二进制方式写文件时,不必拘泥于固有的数据类型,也可以写入自定义的数据类型,比如类。但对于字符串,最好还是用char来写,因为底层是用C实现的。

代码实现:

cpp 复制代码
#include<iostream>
#include<fstream>
using namespace std;
class Person{
    public:
    	char name[1024];
    	int age;
};
void test0226(){
    //1.写入头文件
    //2.定义文件流
    fstream fs;
    //3.打开文件
    fs.open("Person.txt" , ios::out | ios::binary);
    //这里可以直接写成,有对应的构造函数
    //fstream fs("Person.txt" , ios::in | ios::binary);
    //4.写入数据
    Person person={"张三",20} ;
    //person.name = "张三";//这里不对,不能这样写
    //person.age = 20;
    fs.write((const char *)&person , sizeof(person));
    //这里必须用强制类型转换,为什么要用引用,因为要获取地址
    fs.close();
}

可以看到确实有这个文件

二进制读文件

二进制方式读取文件,函数原型:istream read(char *buffer , int len);,参数解释:字符指针buffer指向内存中一段存储空间,len是读写的字节数。

代码:

cpp 复制代码
#include<iostream>
#include<fstream>
using namespace std;
class Person{
    public:
    char name[64];
    int age;
};
void test0226_3() {
	ifstream inBuffer;
	inBuffer.open("Person.txt", ios::in | ios::binary);
	if (!inBuffer.is_open()) {
		return;
	}
	Person person;
	inBuffer.read((char*)&person, sizeof(person));
	cout << "person.name = " << person.name << ",person.age = " << person.age << "." << endl;
	inBuffer.close();
}

int main() {
	cout << "hello ! world ! " << endl;
	test0226_3();
    system("pause");
    return 0;
}

运行结果如下


以上是我的学习笔记,希望对你有所帮助!

如有不当之处欢迎指出!谢谢!

相关推荐
x秀x6 分钟前
sam3新手使用教程
开发语言·python
Java后端的Ai之路7 分钟前
大模型LLM评估完全指南
开发语言·人工智能·python·llm·评估
别动我齐刘海13 分钟前
ROS2 Jazzy + C++ 实战路线——基础学习1
c++·vscode·python·ubuntu·机器学习·自动驾驶·github
Brilliantwxx19 分钟前
【STM32】 从HAL库源码深度解析I2C(源码解析+面试题)
开发语言·stm32·单片机·嵌入式硬件·架构
小白学大数据32 分钟前
Python 小工具实战:用问财接口搭建金融数据采集器
开发语言·人工智能·python
泡海椒34 分钟前
jquick-pdf 核心原理解析:基于 HTML 模板动态渲染 PDF 的实现逻辑
java·开发语言·pdf
j7~34 分钟前
【Linux网络加餐】(篇七)网络版计算器(中):协议落地、报文分隔与完整链路
linux·c++·网络编程·tcp·报文分割·网络计算器·协议落地
青少儿编程课堂44 分钟前
多源最短路与最小环(Floyd 算法图论解析)
c++·python·算法·bfs·信息学竞赛
6Hzlia1 小时前
【Classic 150 刷题计划】 LeetCode 228. 汇总区间 | C++ 锚点游标与断点检测法
c++·算法·leetcode
Severus_black1 小时前
【C++初阶】模板初阶——为何C++能和C语言拉开差距?
c++