数据流是一组有序的有起点和终点的字节数据序列,包括输入流和输出流。
C++正是通过一种称为流的机制提供了一种更加有效的输入输出方法。
流是一种灵活的面向对象的I/O方法。
根据操作对象的不同可以分为控制台流、文件流、字符串流。
C++的输入输出操作分别由输入流(istream)和输出流(ostream)两个类提供,但我们平常都是写头文件
#include
using namespace std;
int main()
{
int a,b;
cin >> a >> b;
cout << a + b;
]
在上面这一段简单的代码中,<<(左移操作符)和>>(右移操作符),因为
文件流的输入输出类在
因为文件设备不像显示器和键盘是标准的默认设备,所有需要定义一个流对象。
ofstream类的默认构造函数原型为:
ofstream::ofstream(const char *filename,int mode = ios::out,int penprot = filebuf::openprot);
参数 | 含义 |
filename | 要打开的文件名称 |
mode | 打开文件的模式 |
penprot | 打开文件的属性 |
mode表
模式类型 | 含义 |
ios::app | 以追加的方式打开文件 |
ios::ate | 打开文件后定位到文件末尾,app就包含此属性 |
ios::binary | 以二进制的方式打开文件 |
ios:in | 以输入的方式打开文件 |
ios:out | 以输出的方式打开文件 |
penprot表
属性值 | 含义 |
0 | 打开并访问普通文件 |
1 | 打开并访问只读文件 |
2 | 打开并访问隐藏文件 |
4 | 打开并访问系统文件 |
"|" 或者 "+"可以吧以上多个属性连接起来,例如0|1就是以普通和只读属性打开文件。
字符串流是能控制字符串类型对象输入输出的类,C++不仅支持(C++风格)string类的字符串流控制,还支持(C语言风格)char[]类型的字符串流控制。
C++文件处理需要头文件
C++由一下三个类支持文件输入输出:
ofstream:写操作的文件类
ifstream:读操作的文件类
fstream:同时读写的文件类
所以要在C++中进行文件读写操作,必须包括
文件处理基本流程:打开文件->处理文件->关闭文件
在对文件进行读或写之前,必须先打开文件。
ofstream和fstream都可以打开文件进行写操作,ifstream打开文件进行读操作。
open函数的标准语法,open是ifstream、ofstream、fstream的对象 一个成员。
void open(const char *filename,ios::openmode mode);
参数 | 含义 |
filename | 要打开文件的名称 |
mode | 以指定的方式打开文件 |
可以把两种以上的模式结合使用,例如,想要以写操作并以追加的方式打开文件:
ofstream outf;
outf.open("file.txt",ios::out | ios::app);
想要以读写的方式打开文件:
fstream file;
file.open("file.txt",ios::in | ios::out);
ofstream、ifstream、fstream这三个类的成员open都有一个默认的打开方式:
类 | 默认打开方式 |
ofstream | ios::out | ios::trunc |
ifstream | ios::in |
fstream | ios::in | ios::out |
其中ios:trunc含义是如果要打开的文件已经存在,则将文件长度设为0。即将打开的文件清空后重写。
在C++中,可以使用流插入符(<<)向文件写入信息,类似于使用它向屏幕输出,不过这里的对象不是cout,而是ofstream或fstream。
在C++中,可以使用流提取符(>>)向文件读取信息,类似于使用从键盘输入,不过这里的对象不是cin,而是ifstream或fstream。
在C++程序终止时,程序会自动关闭刷新所有流,释放所有的内存空间,并关闭所有打开的文件。
但我们在写代码时还是要养成在打开并处理完文件后关闭文件的好习惯。
close()函数的标准语法,close()也是ifstream、ofstream、fstream的对象一个成员。
void close();
长篇大论学了一大堆,终于到了实践环节了。
写一个简单的文件写入程序。
#include
#include
using namespace std;
int main()
{
//1.创建流对象
ofstream outf;
//2.打开文件
outf.open("file.txt",ios::out); //默认是outf.open("file.txt",ios::out | ios::trunc);
if(!outf.is_open()) //判断文件是否成功打开
{
cout << "文件打开失败" << endl;
return 0;
}
//3.写入信息
outf << " 劝学 " << endl;
outf << " (唐)颜真卿 " << endl;
outf << " 三更灯火五更鸡, " << endl;
outf << " 正是男儿读书时。 " << endl;
outf << " 黑发不知勤学早, " << endl;
outf << " 白首方悔读书迟。 " << endl;
//4.关闭文件
outf.close();
return 0;
}
既然文件写入成功,那么再试试文件读取。
将刚才写入文件的内容读取出来打印到屏幕输出。
#include
#include
using namespace std;
int main()
{
string s;
//1.创建流对象
ifstream inf;
//2.打开文件
inf.open("file.txt",ios::in);
if(!inf.is_open())
{
cout << "文件打开失败" << endl;
return 0;
}
//3.读取文件
inf >> s;
//4.关闭文件
inf.close();
cout << s;
return 0;
}
运行这段代码,发现它只读取了第一行就不再读取了。
这是因为在C++中使用ifstream读取文件时会以空格为分隔符,当读取到空格后就不再读取了。
这里有四种方式来读取所有行:
1.可以用get来读取。由于get是用来读取字符的,所以要声明一个char。
#include
#include
using namespace std;
int main()
{
char c;
//1.创建流对象
ifstream inf;
//2.打开文件
inf.open("file.txt",ios::in);
if(!inf.is_open())
{
cout << "文件打开失败" << endl;
return 0;
}
//3.读取文件
while(!inf.eof()) // inf.eof()判断是否到达文件末尾。
{
inf.get(c);
cout << c;
}
//4.关闭文件
inf.close();
return 0;
}
但是使用get一个字符一个字符读取,当数据量十分大时,效率会十分低,所以并不推荐使用这种方式读取。
2.创建一个字符数组buf,将读取到的内容放到buf后输出到屏幕。因为 >> 读取会忽略空格,遇到换行结束,所以打印到屏幕上不会有空格。
#include
#include
using namespace std;
int main()
{
//1.创建流对象
ifstream inf;
//2.打开文件
inf.open("file.txt",ios::in);
if(!inf.is_open())
{
cout << "文件打开失败" << endl;
return 0;
}
//3.读取文件
char buf[1024] = {0};
while(inf >> buf)
{
cout << buf << endl;
}
//4.关闭文件
inf.close();
return 0;
}
3.创建一个字符数组buf,用ifstream类的成员函数getline()循环读取每一行,getline()标准语法如下:
getline(char_type* __s, streamsize __n);
第一个参数输入要读入的数组,第二个参数输入数组的大小。
#include
#include
using namespace std;
int main()
{
//1.创建流对象
ifstream inf;
//2.打开文件
inf.open("file.txt",ios::in);
if(!inf.is_open())
{
cout << "文件打开失败" << endl;
return 0;
}
//3.读取文件
char buf[1024];
while(inf.getline(buf,sizeof(buf)))
{
cout << buf << endl;
}
//4.关闭文件
inf.close();
return 0;
}
4.创建一个string类,同上循环读取每一行放到s中输出到屏幕。
#include
#include
using namespace std;
int main()
{
//1.创建流对象
ifstream inf;
//2.打开文件
inf.open("file.txt",ios::in);
if(!inf.is_open())
{
cout << "文件打开失败" << endl;
return 0;
}
//3.读取文件
string s;
while(getline(inf,s))
{
cout << s << endl;
}
//4.关闭文件
inf.close();
return 0;
}
好了,今天的笔记就写到这了,下次继续!!! -----2025/4/14