c++笔记--I\O

本文是对"铁道版"c++一书的知识点总结,如果侵权,请及时告知我,将尽快删去,本文禁止转载

c++的输入和输出

 

put()函数

输出一个字符

cout.put(‘A’);

 

get()函数

读入数据时可包括空白字符

cin.get(字符型变量);

从输入流中读取一个字符(包括空白符),赋给字符变量ch。如果读取成功则函数返回非0值,如失败(遇到文件结束符EOF)则函数返回0值

 

getline()函数

cin.getline(字符数组,字符个数n,终止标志字符)

cin.getline(字符指针,字符个数n,终止标志字符)

从输入流读取n-1个字符,赋给指定的字符数组(或字符指针指向的数组),然后插入一个字符串结束标志’\n’,如果在读取n-1个字符之前遇到指定的终止字符,则提前结束读取,然后插入一个字符串结束标志’\n’

使用cin>>可以读取c++标准类型的各类数据(如果经过重载,还可用于输入自定义类型的数据),而用cin.getline()只能用于输入字符型数据

使用cin>>读取数据时以空白字符(包括空格符、制表符、回车符)作为终止标志,而cin.getline()可连续读取一系列字符,包括空格

 

ignore()函数

cin.ignore(n,终止字符)

ignore()函数功能是跳过输入流中的n个字符(默认个数为1),或在遇到指定的终止字符(默认终止字符为EOF)时提前结束

cin.ignore(10,’t’);跳过输入流中10个字符,或遇到字符‘t’后就不在跳了,但仍会忽略’t’

ignore()函数可以不带参数或只带一个参数

cin.ignore()相当于cin,ignore(1,EOF)

 

用流成员函数进行输入/输出格式控制

 

设置状态标志的流成员函数setf()

设置状态标志,即是将某一状态标志位置“1”,可使用setf()函数,其一般格式为:

long ios::setf(long flags)

流成员函数setf()括号中的参数flags是用状态标志指定的,状态标志在类示中被定义成枚举

值,所以在引用这些状态标志时要在前面加上"ios::”。状态标志的作用如下所示:

ios::skipws:跳过输人中的空白符,用于输人。

ios::left:输出数据在本域宽范围内左对齐,用于输出。

ios::right:输出数据在本域宽范围内右对齐,用于输出。

ios::internal:数据的符号位左对齐,数据本身右对齐,符号和数据之间为填充符,用于输出。

ios::dec:设置整数的基数为10,用于输人/输出。

ios::oct:设置整数的基数为8,用于输人/输出。

ios::hex:设置整数的基数为16,用于输人/输出。

ios::showbase:输出整数时显示基数符号(八进制数以0打头,十六进制数以Ox打头),用于

输人/输出。

ios::showpoint:浮点数输出时带有小数点,用于输出。

在以科学表示法格式E和以十六进制输出字母时用大写表示,用于输出。

los::uppercase:

ios::showpos:正整数前显示“+”符号,用于输出

ios::scientific:用科学表示法格式(指数)显示浮点数,用于输出。

ios::fixed:用定点格式(固定小数位数)显示浮点数,用于输出。

ios::unitbuf:完成输出操作后立即刷新所有的流,用于输出。

ios::stdio:完成输出操作后刷新stdout和stderr,用于输出。

使用时,其一般的调用格式为:

流对象.setf(ios::状态标志);

 

(1)由于状态标志在类ios中被定义成枚举值,所以在引用这些状态标志时要在前面加上ios

(2)在使用setf()函数设置多项标志时,中间应该用或运算符"I',分隔。例如:

cout.seft(ios::showpos|ios::dec|ios:scientific);

 

清除状态标志的流成员函数unsetf()

清除某一状态标志,即是将某一状态标志位置“0",可使用unseft()函数。它的一般格式为:

long ios::unsetf(long flags)

使用时的调用格式为:

流对象.unsetf(ios::状态标志);

流成员函数unsetf()括号中的参数flags()与流成员函数setf()相同

 

设置域宽的流成员函数width()

设置域宽的成员函数是width()函数,其常用的格式为:

int ios::width(int n);

此函数用来设置宽为n位。(加上要输出的共n位)

注意:所设置的域宽仅对下一个流输出操作有效,当一次输出操作完成之后,域宽又恢复为

默认域宽0。

 

设置实数的精度流成员函数precision()

设置显示精度的成员函数的常用格式为:

int ios::precision(int n);

设置实数的精度为n位,在以一般十进制小数形式输出时,n代表有效数字(是n位数字不是小数点后n位,四舍五入)。在以fixed(固定小数位数)形式和scientific(指数)形式输出时,n为小数位数。

 

填充字符的流成员函数fill()

填充字符的作用:当输出值不满域宽时用填充字符来填充,默认情况下填充字符为空格。所

以,在使用填充字符函数fill()时,必须与width()函数相配合,否则就没有意义。填充字符的成员

函数常用的格式为:

char ios::fill(char(h);

 

使用预定义的操作符进行输入/输出格式控制

 

dec:设置整数的基数为10,用于输人/输出。

hex:设置整数的基数为16用于输人/输出。

oct:设置整数的基数为8用于输人/输出

ws:用于在输人时跳过开头的空白符,用于输人。

endl:输出一个换行符并刷新输出流,用于输出

ends:插人一个空字符null,通常用来结束一个字符串,用于输出

flush:刷新一个输出流,用于输出。

setbase(n):设置整数的基数为n(n的取值为0、8、10或16),n的默认值为0,即以十进制形式输出。用于输人/输出。

setfill(c):设置c为填充字符,默认时为空格,用于输出

setprecision(n):设置实数的精度为n位,在以一般十进制小数形式输出时n代表有效数字。

在以fixed(固定小数位数)形式和scientific(指数)形式输出时n为小数位数设置域宽为n,用

于输出。

setw(n):设置域宽为n,用于输出

setiosflags(f):设置由参数f指定的状态标志,用于输人/输出。

resetiosflags(f):终止由参数f指定的状态标志,用于输人/输出。

操作符setiosflags和resetiosflags要带上状态标态才能使用,下面列出了带有常用的状态标志

的操作符setiosflags和resetiosflagso

setiosflags(ios::left):数据按域宽左对齐输出。

setiosflags(ios::right):数据按域宽右对齐输出。

setiosflags(ios::fixed):固定的小数位数显示。

setiosflags(ios::scientific):设置浮点数以科学记数法(即指数形式)显示。

setiosflags(ios::showpos):在正数前添加一个“+”号输出

setiosflags(ios::uppercase):在以科学记数法格式E和以十六进制输出字母时用大写表示。

resetiosflags(f):终止已设置的状态标志,在括号中应指定f的内容。

在进行输人/输出时,操作符被嵌人到输人或输出链中,用来控制输人/输出的格式,而不是

执行输人或输出操作。为了使用带参数的操作符,程序中必须含有下列预编译命令:

#include<iomanip>

 

使用用户自定义的操作符进行输入/输出格式控制

 

若为输出流定义操作符函数,则定义形式如下:

ostream &操作符名(ostream &stream)

{

自定义代码

return stream;

}

若为输人流定义操作符函数,则定义形式如下:

istream &操作符名(istream &stream)

{

自定义代码

return stream;

}

 

#include<iostream>

#include<iomanip>

using namespace std;

ostream &outputl(ostream &stream)

{

stream.setf(ios::left);

stream<<setw(10)<<hex<<setfill('&');

return stream;

int main()

{

cout<<123<<endI;

cout<<output1<<123<<endI;

return 0;

}

 

文件的打开与关闭

 

ifstream,ofstream,fstream这3个文件流类都定义在头文件fsream中。

要执行文件的输人/输出,须完成以下几件工作,

  1. 在程序中包含头文件fstream,由于文件的输人/输出要用到以上3个文件流类,个文件流类都定义在fstream头文件中,所以首先在程序中要包含头文件fstream
  2. 建立流对象。要以磁盘文件为对象进行输人/输出,必须建立一个文件流类的对象,通过文件流对象将数据从内存输出到磁盘文件,或者通过文件流对象从磁盘文件将数据输人到内存。建立流对象的过程就是定义流类的对象,例如:
ifstream in;

ofstream out;

fstream both;

分别定义了输人流对象in,输出流对象out,输人/输出流对象both,其实,在用标准设备为对象

的输人/输出中,也是要定义对象的,如cin和cout就是流对象。c++就是通过流对象进行输人/

输出的,由于cin、cout已在头文件iostream中事先定义,所以用户不需要自己定义。

  1. 使用成员函数open()打开文件。也就是使某一指定的磁盘文件与某一已定义的文件流对象建立关联。
  2. 进行读写操作。在建立(或打开)的文件基础上执行所要求的输人或输出操作。
  3. 使用close()函数将打开的文件关闭。

open()函数是上述3个流类的成员函数,其原型是在fstream中定义的。在ifstream、ofstream

和fstream类中均有定义,调用成员函数open()一般形式为:

文件流对象.open(文件名,使用方式);

 

方式

功能

ios::in

以输入方式打开文件

ios::out

以输入方式打开文件,如果已有此名字的文件,则将其原有的内容全部清除

ios::app

以输出方式打开文件,写入的数据添加到文件尾部

ios::ate

打开一个已有的文件,把文件指针移到文件末尾

ios::trunc

打开一个文件,若文件存在,删除其中全部数据,若文件不存在,则建立新文件.如果已指定了ios::out方式,而未指定ios::app、ios::in,则同时默认此方式

ios::nocreat

打开一个已有的文件若文件不存在,则打开失败

ios::noreplace

打开一个文件,若文件不存在,则建立新文件,若文件存在则打开失败

ios::binary

以二进制方式打开一个文件,如果不指定此方式,则默认为文本文件

 

文本文件的读/写

 

输入<<、put、write  输出>>、get、getline

 

二进制文件的读/写

 

get() put()

read() write()

inf.read(char *buf, int len)

outf.write(const char *buf, int len)第1个参数的数据类型为char*,如果是其他类型的数据,必须进行类型转换

 

检验文件结束

 

使用成员函数eof()可以检测到这个结束符,如果该函数的返回值非零,表示到达文件尾,返回值为零,表示未到达文件尾

ifstream ifs;

if(!ifs.eof())

检查该流对象是否为零,为零表示文件结束

if(!ifs)

检查流对象的某些成员函数的返回值是否为零,为零表示文件结束

while(cin.get(ch))

 

二进制数据文件的随机读/

 

类istream提供了3个成员函数来对读指针进行操作:

tellg()返回输入文件读指针的当前位置

seekg(文件中的位置)将输入文件中读指针移到指定的位置

seekg(位移量,参照位置)以参照位置为基准移动若干字节

函数参数中的“文件中的位置"和“位移量"都是long型整数,以字节为单位。“参照位置"可以是下面之一

ios::beg从文件开头计算要移动的字节数

ios::cur从文件指针的当前位置计算要移动字节数

ios::end从文件末尾计算要移动的字节数

 

类提供了3个成员函数来对写指针进行操作:

tellp()返回输出文件写指针的当前位置

seekp(文件中的位置)将输出文件中写指针移到指定的位置

seekp(位移量,参照位置)以参照位置为基准移动若干字节

这3个成员函数的含义与前面讲过的操作读指针的3个成员函数的含义相似,只是它们用来操作写指针。

函数seekg()和seekp()的第2个参数可以省略,在这种情况下,就是默认ios::beg

猜你喜欢

转载自blog.csdn.net/smoggyxhdz/article/details/81782887