C++文本文件操作|写入和读取

前言

C++中,文件操作属于技术的应用,不是基本语法
程序运行的时候数据存储在内存中
程序没有运行的时候
数据持久化的两种方式:文件和数据库
在实际开发中,文件操作无处不在

文件操作属于IO
IO类继承关系
![[Pasted image 20240518084053.png]]

写入文本文件

文本文件一般以行的形式组织数据
包含头文件#include <fstream>
ofstream

新建文件写入
#include <iostream>
#include <fstream>
using namespace std;

int main()
{
	ofstream fout; //创建文件输出流对象

	fout.open("test.txt"); //打开文件,如果文件不存在,则创建它;如果文件已存在,则截断其内容

	//向文件中写入数据
	fout << "xxx" << endl;
	fout << "yyy" << endl;
	fout << "zzz" << endl;

	fout.close(); //关闭文件,fout对象失效前会自动调用close()

	cout << "文件操作完成" << endl;
}

![[Pasted image 20240518085131.png]]

程序在哪个目录运行,生成的文件就在哪个目录
![[Pasted image 20240518085213.png]]

![[Pasted image 20240518085225.png]]

open()成员函数的参数,可以用c风格的字符串,也可以用string
open()函数有重载,两种参数都支持

#include <iostream>
#include <fstream>
using namespace std;

string filename = "test.txt";
//char filename[] = "test.txt";

int main()
{
	ofstream fout; //创建文件输出流对象

	fout.open(filename); //打开文件,如果文件不存在,则创建它;如果文件已存在,则截断其内容

	//向文件中写入数据
	fout << "xxx" << endl;
	fout << "yyy" << endl;
	fout << "zzz" << endl;

	fout.close(); //关闭文件,fout对象失效前会自动调用close()

	cout << "文件操作完成" << endl;
}
指定文件写入

在实际开发中,一般会把数据文件夹存放在指定目录
所以filename要用文件的全路径,不能只是文件名

#include <iostream>
#include <fstream>
using namespace std;

string filename = "D:\\data\\txt\\test.txt";
//char filename[] = "test.txt";

int main()
{
	ofstream fout; //创建文件输出流对象

	fout.open(filename); //打开文件,如果文件不存在,则创建它;如果文件已存在,则截断其内容

	//向文件中写入数据
	fout << "xxx" << endl;
	fout << "yyy" << endl;
	fout << "zzz" << endl;

	fout.close(); //关闭文件,fout对象失效前会自动调用close()

	cout << "文件操作完成" << endl;
}

C++中\用于转义,可以用\\

其他写法

R"(D:\data\txt\test.txt) //原始字面量
"D:/data/txt/test.txt"   //用反斜杠
"/data/txt/test.txt"     //Linux中

打开文件,可以用open()成员函数
也可以在ofstream fout的时候,传入文件名

ofstream fout(filename);

ofstream类有重载的构造函数,在函数中会打开文件

#include <iostream>
#include <fstream>
using namespace std;

string filename = "D:\\data\\txt\\test.txt";
//char filename[] = "test.txt";

int main()
{
	ofstream fout(filename); //创建文件输出流对象

	//fout.open(filename); //打开文件,如果文件不存在,则创建它;如果文件已存在,则截断其内容

	//向文件中写入数据
	fout << "xxx" << endl;
	fout << "yyy" << endl;
	fout << "zzz" << endl;

	fout.close(); //关闭文件,fout对象失效前会自动调用close()

	cout << "文件操作完成" << endl;
}
打开模式

打开模式
如果文件已经存在,打开模式可以决定是否清空原文件内容

ios::out     缺省值,会截断文件内容
ios::trunc   截断文件内容
ios::app     不截断文件内容,只在文件末尾追加文件

这三行代码效果一样

ofstream fout(filename);
ofstream fout(filename, ios::out);
ofstream fout(filename, ios::trunc);

用open函数和构造函数是一样的

判断打开文件是否成功

判断打开文件是否成功

if (fout.is_open() == false)
{
	cout << "打开文件" << filename << "失败" << endl;
	return 0;
}

失败的原因主要有

  1. 目录不存在
  2. 磁盘空间已满
  3. 没有权限,Linux中常见

读取文本文件

#include <iostream>
#include <fstream>
using namespace std;

string filename = "D:\\data\\txt\\test.txt";
//char filename[] = "test.txt";

int main()
{
	ifstream fin; //创建文件输出流对象
	fin.open (filename, ios::in);

	if (fin.is_open() == false)
	{
		cout << "打开文件" << filename << "失败" << endl;
		return 0;
	}
	
	//读取文件内容
	
	fin.close(); //关闭文件,fin对象失效前会自动调用close()

	cout << "文件操作完成" << endl;
}

输入流只有一种打开模式

ios::in

缺省值,这个参数填不填都一样

ifstream fin(filename);
ifstream fin(filename, ios::in);

读取文件内容代码
文本文件一般以行的方式组织数据
所以读取数据的时候要一行一行地读
从输入流中读取一行数据,可以用getline()函数
需要包含string头文件

string buffer;
getline(fin, buffer);

从文件中读取一行数据,存放在buffer中

读取文件全部内容

如果想要读取文件中全部数据,要用一个while循环

方法一
while (getline(fin, buffer))
{
	cout << buffer << endl;
}

把文件的内容一行一行读出来,放到buffer中
如果文件结束了,getline会返回空

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

string filename = "test.txt";
//char filename[] = "test.txt";

int main()
{
	ifstream fin; //创建文件输出流对象
	fin.open (filename, ios::in);

	if (fin.is_open() == false)
	{
		cout << "打开文件" << filename << "失败" << endl;
		return 0;
	}
	
	//读取文件内容
	string buffer;
	while (getline(fin, buffer))
	{
		cout << buffer << endl;
	}

	fin.close(); //关闭文件,fin对象失效前会自动调用close()

	cout << "文件操作完成" << endl;
}

![[Pasted image 20240518093840.png]]

方法二
char buffer[101];  //存放从文件中读取的内容
//如果采用ifstream.getline(),一定要保证缓冲区足够大
while (fin.getline(buffer, 100))
{
	cout << buffer << endl;
}

getline()是输入流ifstream的成员函数,不是全局函数
参数也不同,第二个参数是最多读取内容的字节数
buffer是c风格的字符串,不能扩展,要保证足够大

方法三
string buffer;
while (fin >> buffer)
{
	cout << buffer << endl;
}

会间隔空格和换行符读取

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值