首先介绍文件读写之前先来谈谈(因为我感觉名字有点相似容易弄混)
C++的输入输出分为三种:
1.控制台的输入输出(也是大家最常用到的)
头文件 | 类型 |
iostream | istream从流中读取 ostream写到流中去 iostream对流进行读写 |
2.字符串的输入输出
头文件 | 类型 |
sstream | istringstream从string对象中读取 ostringstream写到string对象中去 stringstream对string对象进行读写 |
3.文件的输入输出
头文件 | 类型 |
fstream | ifstream从文件中读取 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 | 二进制方式 |
打开方式这里也可以留空,留空的话根据类的不同默认方式也不同(如果不为空,就按照你写的打开方式来)
类 | 参数的默认方式 | 含义 |
ofstream | ios::out|ios::trunc | 写的方式打开文件,并且如果文件已存在则删除该文件 |
ifstream | ios::in | 只读方式打开文件 |
fstream | ios::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-保存
1 条评论
[…] C++ 文件读写操作fstream详解 […]