C++的 I/O是以一连串的字节流的方式进行的,在输入操作中,字节从设备(键盘,磁盘驱动器等)流向内存。在输出操作中,字节从内存流向设备(显示屏,打印机等)
C++将每个文件看成是字节序列流。
一、关于流的头文件
绝大多数的C++程序都包含了< iostream >
头文件,该头文件中声明了所有I/O流操作的所需的基础服务。
< iostream >
头文件定义了 cin 标准输入流、cout 标准输出流、cerr 标准错误流 和 clog 有缓冲的标准错误流(流输出内容存入缓冲区,直到缓冲区填满或是被清空才会输出)
< iomanip >
头文件声明了对于带有参数化流运算符(例如 setw 和 setprecision)的格式化I/O有用的服务
<fstream>
头文件声明了用户控制的文件处理服务
二、文件打开模式
三、输出流输出功能
输出功能包括
流插入运算符 <<
put成员函数进行字符输出
write成员函数进行非格式化的输出
十进制、八进制、十六进制格式的整数输出
不同精确度的浮点数的输出
指定宽度数据的输出
。。。。。。
构造输出流对象打开文件——用于修改
默认输出流文件打开模式是 ios::out
当不需要文件时显示的将其关闭,可以减少资源占用 file.close();
举例:使用I/O流以文本方式建立一个文件test.txt,并写入字符!
ofstream file1("E:\\Codes\\TestInfo\\test.txt");
cout << "the file is writing......" << endl;
file1<<"successful input!";
file1.close();
cout<<"done!"<<endl;
文件输出流成员函数
put 成员函数
cout.put('A');
显示单个字符。
put也可级联使用
cout.put('A').put('\n');`
cout.put('A'); 效果基本等同于 cout<<'A';
cout.put('AAAA'); //错误,只能输出单个字符
warning: overflow in implicit constant conversion [-Woverflow]
write 成员函数
将内存中的一块内容写到一个文件输出流中
从字符数组中输出字节到文件中去
四、输入流
构造输入流对象打开文件——用于读取
文件输入流的默认打开模式 ios::in
输入流相关函数
get成员函数
功能和 >> 很像,主要的不同点在于 get函数在读入数据时包括空白字符
get函数在遇到文件尾的时候返回 EOF
getline 成员/非成员函数
读取多行字符,每读一行存储一次,可定义行分割符
非成员函数
函数原型
template<> std::istream &std::getline<...>(std::istream &__is, std::string &__str, char __delim)
第一个参数传入输入流,第二个参数传入string字符串,第三个参数为自定义行分割符,getline读取到行分割符就结束本次读取,并将自定义的行分割符从流中删除
举例:分行读取文件中的内容
文件中的内容
123
456
789
#include<iostream>
#include<fstream>
using namespace std;
int main(){
string line1;
string line2;
string line3;
ifstream ifile("E:\\Codes\\Program-c++\\Zhenli_Book_Code\\11-7.txt");
getline(ifile, line1);
getline(ifile, line2,'5');
getline(ifile, line3);
cout<<line1<<endl<<line2<<endl<<line3<<endl;
}
读取结果
123
4
6
成员函数
成员函数只能将读取到内容存储在字符数组中
char[ ]
函数原型
template<> std::istream &std::istream::getline(char *__s, std::streamsize __n, char __delim)
、第一个参数时字符数组,第二个参数是读取的字节数,第三个参数为自定义行分割符
读取的字节数已满或者已到自定义的行分割符,则getline都会结束本次读取,并将自定义的行分割符从流中删除
int main(){
char buf1[10];
char buf2[10];
char buf3[10];
ifstream ifile("E:\\Codes\\Program-c++\\Zhenli_Book_Code\\11-7.txt");
ifile.getline(buf1,10,'2');
ifile.getline(buf2, 10);
ifile.getline(buf3, 10);
cout<<buf1<<endl<<buf2<<endl<<buf3<<endl;
}
输出结果
1
3
456
read 成员函数
从文件中读取内容输入到字符数组中
由长度参数确定要读的字节数