首先介绍文件读写之前先来谈谈(因为我感觉名字有点相似容易弄混)

C++的输入输出




C++的输入输出分为三种:

1.控制台的输入输出(也是大家最常用到的)

头文件类型
iostreamistream从流中读取
ostream写到流中去
iostream对流进行读写

2.字符串的输入输出

头文件类型
sstreamistringstream从string对象中读取
ostringstream写到string对象中去
stringstream对string对象进行读写

3.文件的输入输出

头文件类型
fstreamifstream从文件中读取
ofstream写到文件中去
fstream对文件进行读写




C语言里面对文件操作是通过文件指针来实现的。那么C++如何操作呢?

C++里面通过fstream这个文件流来实现的;什么意思?就是你需要在程序最前面写上一句

#include <fstream>

然后我们就可以使用ifstream,ofstream以及fstream 这三个类了。

  • ifstream操作(输入)
  • ofstream操作(输出)
  • fstream:可同时读写操作(输入输出)

使用方法例如:

fstream file;

这样我们就定义了一个叫file的对象了。可以调用fstream类里面的一些函数。




打开文件:open()

那么下一步我们就需要打开文件,举个例子

file.open("abc.txt", ios::in);

这句代码的意思打开程序运行目录下的abc.txt,以只读方式打开

格式就是: 流对象.open(文件名,打开方式);

打开方式一共有六种,可以根据需要自行选择;

ios::in读的方式打开文件(输入)
ios::out写的方式打开文件(输出)
ios::ate初始位置:文件尾
ios::app所有输出附加在文件末尾
ios::trunc如果文件已存在则先删除该文件
ios::binary二进制方式

打开方式这里也可以留空,留空的话根据类的不同默认方式也不同(如果不为空,就按照你写的打开方式来)

参数的默认方式含义
ofstreamios::out|ios::trunc写的方式打开文件,并且如果文件已存在则删除该文件
ifstreamios::in只读方式打开文件
fstreamios::in | ios::out读和写的方式打开文件

例如:

fstream file;
file.open ("example.bin", ios::out | ios::app | ios::binary);
//以二进制方式打开文件example.bin,在文件末尾写入一些数据

file.open ("abc.txt");
//因为是fstream所以这里的默认值是ios::in | ios::out,也就是以读和写的方式打开文件




判断文件是否被打开:is_open()

你可以通过调用is_open()这个函数来检查一个文件是否已经被顺利打开。例如:

file.open("abc.txt", ios::in);//打开文件

	if (file.is_open()) {			//判断文件是否存在
		cout<<"文件被成功打开.";	
	}
	else {
		cout<<"文件打开失败.";				
	}

is_open()这个函数是bool型的,如果返回真(true)表示文件已经被打开,返回假(false)则文件没有被打开。




文件末尾:eof()

但是有些时候,文件虽然存在但是有可能文件大小为0,如何判断文件是否为空文件呢

这里我们需要读文件,判断文件是否 一打开就是eof()
一个文件不管它有没有内容,它的末尾一定是有个eof()

	file.open("abc.txt", ios::in);//打开文件

	char c;
	file >> c;
	if (file.eof())
	{
		cout << "文件内容为空";
	}
	else {
		cout << "文件内容不为空";
	}
	return 0;
}

但是请注意,一定是在abc.txt这个文件存在的情况下,再使用eof()来判断是否为空




关闭文件:close()

当文件读写操作完成以后,我们必须将文件关闭以使文件重新变为可访问的。关闭文件需要调用成员函数close(),它负责将缓存中的数据排放出来并关闭文件。

这个函数一旦被调用,原来流的对象就可以用来打开其它的文件了,这个文件也可以重新被其他的进程访问了。

例如:

file.close();

请一定记住关闭文件,否则可能会导致你后面的代码出现错误。(如果你发现死循环在某个位置,你可以尝试看看前面有没有关闭文件...血的教训)




创建文件:= 输出

//以下三种方式都可以创建出来abc.txt但是没有内容

file.open("abc.txt", ios::out);//如果没有这个文件会自动创建

file.open("abc.txt", fstream::out);//创建一个abc.txt的文件

ofstream file("abc.txt", fstream::out);	//创建一个abc.txt的文件




输出文件(把内容输出到文件里):<<操作符

我们上面提到的类ofstream,ifstream和fstream是分别从ostream,istream,iostream类中继承来的。

所以其实文件操作的读写类似于(cin,cout),没错,可能你已经猜到了,我们使用

  • << 操作符将信息写入文件
  • >> 操作符将信息读入到内存

	file.open("abc.txt", ios::out);//写的方式打开文件
	file << "123";
	file.close();

此时如果程序运行目录下没有abc.txt,就会自动创建一个abc.txt;

如果程序目录下有abc.txt,就会覆盖掉abc.txt全部内容。

此时abc.txt的内容为123

和使用cout的时候一样,我们可以连续使用<<来输出,并且可以跟各种类型的变量 。例如:

	int a= 520;

	file.open("abc.txt", ios::out);//写的方式打开文件
	file << "1314"<< a;
	file.close();

此时abc.txt文本的内容为1314520




读文件(把文件的内容读入到内存中): >>操作符

如同上面提到的一样,我们使用

  • >> 操作符将信息读入到内存

	int a;

	file.open("abc.txt", ios::in);//读的方式打开文件
	file >> a;
	file.close();

此时a的值就等于abc.txt文件的内容,也就是刚刚上面我们存入的1314520




读文件的核心骚操作!很重要!

1)一行一行内容读文件

如果我想一行一行的读文件怎么办呢,这里需要用到上面提到过的eof()

eof()表示已经到文件的末尾了,所以我们可以使用while循环判断是否到文件末尾,如果到了就停止循环。例如:

此时abc.txt文本的内容为三组数字,每组数字之间是回车

	int a;

	file.open("abc.txt", ios::in);//读的方式打开文件
	while (!file.eof()) {
		file >> a;
	}
	file.close();

我们通过打断点的方式,可以发现循环一共执行了三次(因为abc.txt的内容就三行)并且观察a的值,第一循环的时候为110,第二次循环的时候a被改变成120,第三次a变成119了

以上就是一行一行读的方法

2)一行一行读文件,并且把每个部分存入到不同的变量

第二种方法什么意思呢,如图

上面是一个记录个人信息的abc.txt文本,内容格式是:姓名空格年龄空格编号

每一个人为一行。所以这里我们不仅仅要一行一行的读,还应该把相应的内容存放到相应的变量里面

在写文件的时候我们提到可以连续使用操作符。这里也可以连续使用>>

	string name;
	int age, id;

	file.open("abc.txt", ios::in);//读的方式打开文件
	while (!file.eof()) {
		file >> name >> age >> id;
	}
	file.close();

还是通过断点的方式,因为abc.txt里面只有两行,所以循环了两次

上面我们有提到过存储的格式是 姓名空格年龄空格编号;都是以空格分割的

这里>>操作符自动帮我们分割了文本,把相应的文本传入了相应的变量。

*****有可能你会发现你这里是乱码,注意txt存储的编码使用ANSI

具体方法是:文件-另存为-编码选择ANSI-保存

最后修改:2022 年 03 月 08 日
如果觉得我的文章对你有用,请随意赞赏