一、文件流
C++的IO类中定义了三个文件读写流fstream、ifstream以及ofstream,它们都继承于相同的父类istream,通过不同的实现以实现不同的文件流操作。
三者的区别为:
ifstream:从文件读取数据
ofstream:从文件写入数据
fstream:既可以读数据、又可以写数据
1.1 IO接口和读写模式
三个文件流实现了以下几个函数接口:
这些模式可以单独使用,也可以组合使用,如果需要组合使用,使用逻辑操作符
|
或起来即可。这里要特别注意的是
ios::out
模式默认会截断文件,也就是说,
ios::out
和
ios::out | ios::trunc
效果是一样的,都会将文件截断。如果不希望以截断方式打开文件时,则需要设置读写模式为
ios::out | ios::app
,以这种模式打开文件后,数据会以追加的方式写入到文件。
1.2 读写文件示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 写文件
void
write_file
(
)
{
ofstream
output
;
// 待写入数据
string
output_data
=
"HelloWorld\nWelcome To Tencent\n"
;
// 打开文件
output
.
open
(
"test.txt"
,
ios
::
out
)
;
// 写入数据
output
.
write
(
output_data
.
c_str
(
)
,
output_data
.
size
(
)
)
;
// 关闭文件
output
.
close
(
)
;
}
注意:
在使用IO操作符从文件读取数据的时候,数据输入的对象可以是字符串,也可以是对应的数据类型(如int)。如果输入到字符串,默认是读到空白字符的时候就停止了,需要通过循环控制读取后面的数据。
二、流状态
流在执行IO操作的时候,会根据不同的情况产生不同的状态码,如:
我们可以使用已经封装好的函数
bad()/fail()/eof()/good()
来判断当前IO是否已经达到某种状态,如判断文件是否已经读到结束。同时,我们还可以使用
clear()
函数来清除当前IO对象的状态位,当流已崩溃(如将流中的字符串对象读到一个int对象上)时,可以手动来清除状态位继续往下读取。
示例,使用eof标志位判断文件是否读完成
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
ofstream
output
(
"test.txt"
)
;
ifstream
input
(
"test.txt"
)
;
std
::
string
input_data
;
output
<<
"Hello World\n"
;
output
.
close
(
)
;
while
(
!
input
.
eof
(
)
)
{
// 没有读到文件尾就一直读取
input_data
.
clear
(
)
;
input
>>
input_data
;
// 读到空白符就停止
// 过滤掉空行
if
(
input_data
==
""
)
continue
;
cout
<<
input_data
<<
endl
;
}
input
.
close
(
)
;
因为使用IO操作符从流中读取数据默认遇到空行就停止,所以
Hello World\n
字符串需要读三次才能读完,第一次是
Hello
,第二次是
World
,第三次是换行后的空行,所以,最后的输出结果是:
三、getline一次读一行
流对象中内置了getline()成员方法可以一次读一行数据到字符串数组中,需要传入一个字符数组和最大长度size:
ifstream input("aabbcc.txt", ios::in);
if (!input) {
cout << "open fail error: " << strerror(errno) << endl;
使用形式: using指令(using directive)的使用形式为using namespace std。 using声明(using declaration)的使用形式为using std::...
1,274
一、const和成员函数的故事 const的用途有以下几种: 修饰全局、局部、成员变量 修饰成员函数 修饰变量的时候const限制了变量在整个程序运行期间都是不能修改的,而修饰成员函数的时候限制函数内...
1,579
c++11
一、前言 昨天在公司做代码扫描,发现很多类似以下的代码都产生了告警,导致扫描不通过: virtual int func() override {} 不通过的原因是:同时使用virtual和overri...
3,297
c++11
问题场景:服务器有多个网卡,分别绑定了地址A、地址B和地址C,当客户端连接请求过来的时候,如何知道是从哪个IP地址请求过来的? 解决方案:服务端accept客户端的连接后,对这个新接受的socket进...
1,150
网络编程