文件和输入输出流

🗨️字数统计=1.1k字 ⏳阅读时长≈4分钟
  • C++的 I/O是以一连串的字节流的方式进行的,在输入操作中,字节从设备(键盘,磁盘驱动器等)流向内存。在输出操作中,字节从内存流向设备(显示屏,打印机等)
  • C++将每个文件看成是字节序列流。

一、关于流的头文件

绝大多数的C++程序都包含了< iostream >头文件,该头文件中声明了所有I/O流操作的所需的基础服务。


< iostream >头文件定义了 cin 标准输入流、cout 标准输出流、cerr 标准错误流 和 clog 有缓冲的标准错误流(流输出内容存入缓冲区,直到缓冲区填满或是被清空才会输出)


< iomanip > 头文件声明了对于带有参数化流运算符(例如 setw 和 setprecision)的格式化I/O有用的服务


<fstream> 头文件声明了用户控制的文件处理服务



二、文件打开模式


三、输出流

输出功能包括

  • 流插入运算符 <<
  • put成员函数进行字符输出
  • write成员函数进行非格式化的输出
  • 十进制、八进制、十六进制格式的整数输出
  • 不同精确度的浮点数的输出
  • 指定宽度数据的输出
  • 。。。。。。

1. 构造输出流对象打开文件——用于修改


默认输出流文件打开模式是 ios::out


当不需要文件时显示的将其关闭,可以减少资源占用 file.close();


举例:使用I/O流以文本方式建立一个文件test.txt,并写入字符!

1
2
3
4
5
ofstream file1("E:\\Codes\\TestInfo\\test.txt");
cout << "the file is writing......" << endl;
file1<<"successful input!";
file1.close();
cout<<"done!"<<endl;

2. 文件输出流成员函数

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 成员函数

将内存中的一块内容写到一个文件输出流中

从字符数组中输出字节到文件中去

四、输入流

1. 构造输入流对象打开文件——用于读取


文件输入流的默认打开模式 ios::in

2. 输入流相关函数

get成员函数

功能和 >> 很像,主要的不同点在于 get函数在读入数据时包括空白字符


get函数在遇到文件尾的时候返回 EOF

getline 成员/非成员函数

读取多行字符,每读一行存储一次,可定义行分割符

  • 非成员函数

    函数原型 template<> std::istream &std::getline<...>(std::istream &__is, std::string &__str, char __delim)

    第一个参数传入输入流,第二个参数传入string字符串,第三个参数为自定义行分割符,getline读取到行分割符就结束本次读取,并将自定义的行分割符从流中删除


举例:分行读取文件中的内容

文件中的内容
123
456
789

1
2
3
4
5
6
7
8
9
10
11
12
13
#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都会结束本次读取,并将自定义的行分割符从流中删除

1
2
3
4
5
6
7
8
9
10
11
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 成员函数

从文件中读取内容输入到字符数组中
由长度参数确定要读的字节数

分享到