C++中的输入输出流

以下为本人大一时阅读《C++ Primer Plus》中关于输入输出流章节所做的笔记

C++中的输入输出流_第1张图片

流:

输入:字节从设备流向内存

输出:字节从内存流向设备

非格式化的I/O:通常针对单个字节传输,速度快,不方便

格式化的I/O:字节被组成有意义的单元,例如整数、浮点数等

C++中的输入输出流_第2张图片

传统流与标准流:

char:1个字节,表示ASCII

wchar_t:2个字节,表示Unicode

char16_t、char32_t:指定大小的字符类型

iostream库的头文件

iostream:cin、cout、cerr、clog

iomanip:setw、setprecision

fstream:文件处理服务

输入/输出流的类和对象:

I/O流模板层次部分:

C++中的输入输出流_第3张图片

<<被重载为实现流的输出,称为流插入运算符(stream insertion operator)

>>被重载用于实现流的输入,称为流提取运算符(stream extraction operator)

cin-->连接到标准输入,通常是键盘

cout-->连接到标准输出设备,通常是显示屏

cerr-->连接到标准错误设备,输出无缓冲,意味着输出立刻显示

clog-->连接到标准错误设备,输出有缓冲,直到缓冲区填满或是被清空才会出书,可以加强I/O性能

类模板:

basic_istream(istream)支持输入流操作

basic_ostream(ostream)支持输出流操作

basic_iostream(iostream)支持输入流和输出流操作

basic_ifstream(ifstream)用于文件输入

basic_ofstream(ofstream)用于文件输入

basic_fstream(fstream)用于文件输入和输出

C++中的输入输出流_第4张图片

输出流:

char*变量的输出:

如果想输出char*的值(也即是字符串第一个字符的内存地址),但是<<运算符已被重载用于打印将char*数据类型作为以空字符结尾的字符串(即打印出这个内存地址上的字符串),如要打印出地址,先将char*强制转化为void*类型。

const char* const word="again";

cout<(word);

使用put进行字符输出:

输出字符:

cout.put('A');

级联使用:

cout.put('A').put('\n');

用代表一个ASCII值的数字表达式作为参数调用put成员函数:

cout.put(65); //输出A

注意:put函数每次只能输出一个字符

输入流:

在每个输入操作之后,流提取运算符给接受到所提取的信息的流对象返回一个引用。

如果引用被用作判断条件,那么将隐式调用流重载的void*强制转换运算符函数,根据最后输入操作的成功与否将引用转化为非空指针或空指针。非空指针转化为true,表示输入成功。空指针转化为false,表示操作失败。

get和getline成员函数:

EOF是一个int类型的值。

打印cin.eof()的值,如果是0,表示cin流还没有读到文件尾;如果是1,表示cin已经读到文件尾。

cin和cin.get:

cin.get(buffer, 10);

cin输入读取字符直到遇到空白字符。

cin.get默认分隔符是'\n'。

cin.get()函数有三个参数:一个字符数组,一个数组长度限制(读取字符个数最多为数组长度限制-1,因为在字符数组最后要插入一个空字符),一个分隔符。当读取到分隔符时候读取终止,这时候分隔符没有放置到字符数组中,而是保留在输入流中(分隔符是下一个被读取的字符),因此第二次调用get函数将读取一个分隔符,除非将分隔符从输入流中移出(可以使用cin.ignore())。

cin.get()函数返回输入的字符。当读取到输入文件结束符(windows操作系统是Ctrl+Z)返回EOF。

成员函数getline:

getline函数和get函数很类似,功能也基本一致

cin.getline(buffer, 10);

ignore函数:

istream的成员函数ignore可以读取并丢弃一定数量的字符(默认为1个字符)或者遇到指定分隔符时停止(默认为EOF)

putback函数:

将先前使用get函数从输入流中获得的字符再放回到流中。

peek函数:

返回输入流中的下一个字符,但并不将它从流里去除。

成员函数read和write:

分别是非格式化的输入和输出函数。

read函数将一定数量的字节读入到字符数组中,write函数则从字符数组中输出字节。这些字节没有经过任何格式化,它们就像原始字节一样输入和输出。

cin.read(buffer, 10);

将会读取10个字符到字符数组buffer中。

cout.write("ABCDEFGHIJKL", 10);

将会输出前10个字母。

成员函数gcount返回最近一次输入操作所读取的字符数。

cout.write(buffer, cin.gcount());

流操纵符(stream manipulator):

整形流的基数:dec、oct、hex、setbase:

使用setbase必须包含(任何参数化的操纵符都需要包含这个头文件)(可以用nosetbase取消setbase的设置)

cin>>number;

cout<

cout<

cout<

cout<

上述最后四行分别表示:用八进制、十进制、十六进制、十进制输出number。

注意:

1.操纵符具有黏性。

例:

cout<

cout<

当使用上述代码后,后面使用cout输出任何数都用十六进制输出,直到显式地重新设置基数

2.setbase函数的参数不是8或16时,后述的cout输出都使用十进制输出,例如cout<

浮点精度(precision、setprecision):

调用setprecision或ios_base的成员函数precision来控制浮点数的精度

cout<

cout.precision(2); //后面的输出都将输出小数点后2位

cout<

域宽(width, setw)

width函数:如果输出值的宽度比域宽小,则插入填充字符进行填充(在左侧填充)。大于域宽的将全部打印出来。不含参数的width函数将返回当前域宽。注意width函数和setw函数的宽度设置只适用于下一次输入或输出,是非黏性的

int a=1;

cout.width(3);

cout<

cout<

自定义输出流操纵符

注意对于输出流操纵符来说,它们的返回类型和参数都必须是ostream&类型,下面写一个跟endl类似的endline输出流操纵符

ostream& endline(ostream& output)

{

        return output<<"\n"<

}

int main()

{

        cout<<"000"<

        return 0;

}

showpoint:

强制要求浮点数输出带小数点和尾数零(浮点数默认精度是6,故默认输出补充零到小数点后五位,除非重新设置了精度)(黏性设置)

cout<

对齐(left, right, internal):

流操纵符left使域左对齐并在其右边填充字符,right相反。填充字符由成员函数fill或是参数化刘操纵符setfill指定(默认是空字符)。对齐与setfill、fill都是黏性的

cout.fill('*');

cout<

cout<

cout<

流操纵符internal表示数字的符号应当左对齐,数字的数值部分应当右对齐,中间部分则使用填充字符填充。使用showpos表示强制要求正数需要输出加号,通是可以使用noshowpos取消showpos设置(showpos是黏性设置)

cout<

cout<

scientic,fixed:

都是黏性操作符。fixed要求浮点数以指定小数位数形式显示。scientific要求用科学计数法输出浮点数。

double x=0.00123456;

double y=1.946e9;

cout<

cout<

cout<

输出:

0.00123456 1.946e+009

1.234560e-003 1.946000e+009

0.001235 1946000000.000000

showbase:

使用showbase要求数字输出前面带上基数,即十进制整数不变,八进制带上0,十六进制带上0x(黏性设置,使用noshowbase取消设置)

int x=100;

cout<

cout<

输出:

0x64

uppercase:

默认情况下十六进制值中的字符和科学计数法中的浮点数的字母e都是用小写字母表示,用uppercase后将用大写字母表示,黏性设置,同时可以用nouppercase取消设置。

int x=4564651235645465;

cout<

cout<

boolalpha:

使用boolalpha设置输出流以字符串true和flase来显式bool值,取代1和0的输出形式。黏性设置,可以使用noboolalpha来取代。(使用uppercase后不会导致字符串换为大写字母)

bool b=1;

cout<

流的错误状态:

cin.eof()  判断流是否遇到了文件尾,是返回1,否则返回0

遇到文件尾,eofbit会被设置

读取到不符合要求的类型时(例如要读取整数却读到了不是非数字字符时),failbit会被设置

发生数据丢失错误时,badbit会被设置

当eofbit、failbit、badbit都是false,goodbit会被设置为true

IO操作只能在“好的”流中进行

cin.clear()  clear函数将流的状态重置为“好的”,使流可以继续进行IO操作。clear函数的默认参数是goodbit

cin.clear(); 清空了cin,并且将该流设置goodbit位

cin.clear(ios::failbit); 为流设置failbit位。

你可能感兴趣的:(C++学习笔记,c++,开发语言)