输入输出流(二)

1、流成员函数

1)put 和get

ostream类除了提供上面介绍过的用于格式控制的成员函数外,还提供了专用于输出单个字符的成员函数put。如cout.put(′a′);put函数的参数可以是字符或字符的ASCII代码(也可以是一个整型表达式)。可以在一个语句中连续调用put函数。如cout.put(71).put(79).pu(79).put(68).put(′\\n′);putchar函数是C语言中使用的,在stdio.h头文件中定义。C++保留了这个函数,在iostream头文件中定义。

流提取符“>>”从流中提取数据时通常跳过输入流中的空格、tab键、换行符等空白字符。 注意: 只有在输入完数据再按回车键后,该行数据才被送入键盘缓冲区,形成输入流,提取运算符“>>”才能从中提取数据。需要注意保证从流中读取数据能正常进行。

除了可以用cin输入标准类型的数据外,还可以用istream类流对象的一些成员函数,实现字符的输入。用get函数读入一个字符。

(1) 不带参数的get函数

其调用形式为

cin.get()

用来从指定的输入流中提取一个字符,函数的返回值就是读入的字符。若遇到输入流中的文件结束符,则函数值返回文件结束标志EOF(End Of File) 。C语言中的getchar函数与流成员函数cin.get( )的功能相同,C++保留了C的这种用法。

(2) 有一个参数的get函数

其调用形式为

扫描二维码关注公众号,回复: 9126744 查看本文章

cin.get(ch)

其作用是从输入流中读取一个字符,赋给字符变量ch。如果读取成功则函数返回非0值(真),如失败(遇文件结束符) 则函数返回0值(假)。

#include <iostream>

#include <string>

#include <iomanip>

using namespace std;

int main()

{

char c;

cout<<"enter a sentence:"<<endl;

while(cin.get(c))

{

cout.put(c);

}

cout<<"end"<<endl;

return 1;

}

(3) 有3个参数的get函数

其调用形式为

cin.get(字符数组,字符个数n,终止字符)    或

cin.get(字符指针,字符个数n,终止字符)

其作用是从输入流中读取n-1个字符,赋给指定的字符数组(或字符指针指向的数组),如果在读取n-1个字符之前遇到指定的终止字符,则提前结束读取。如果读取成功则函数返回非0值(真),如失败(遇文件结束符) 则函数返回0值(假)。

2)用成员函数getline函数读入一行字符

    getline函数的作用是从输入流中读取一行字符,其用法与带3个参数的get函数类似。即

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

3) eof函数

eof是end of file的缩写,表示“文件结束”。从输入流读取数据,如果到达文件末尾(遇文件结束符),eof函数值为非零值(表示真),否则为0(假)。

4)peek函数

peek函数的作用是观测下一个字符。其调用形式为

c=cin.peek( );cin.peek

函数的返回值是指针指向的当前字符,但它只是观测,指针仍停留在当前位置,并不后移。如果要访问的字符是文件结束符,则函数值是EOF(-1)。

5)putback函数,其调用形式为

cin.putback(ch);

    其作用是将前面用get或getline函数从输入流中读取的字符ch返回到输入流,插入到当前指针位置,以供后面读取。

#include <iostream>

using namespace std;

int main( )

{char c[20];

 int ch;

 cout<<"please enter a sentence:"<<endl;

 cin.getline(c,15,'/');

 cout<<"The first part is:"<<c<<endl;

 ch=cin.peek( );//观看当前字符

 cout<<"The next character(ASCII code) is:"<<ch<<endl;

 cin.putback(c[0]);             //将′I′插入到指针所指处 

 cin.getline(c,15,'/');

 cout<<"The second part is:"<<"OK To C"<<c<<endl;

 return 0;

}

6)ignore函数

其调用形式为

cin,ignore(n, 终止字符)

函数作用是跳过输入流中n个字符,或在遇到指定的终止字符时提前结束(此时跳过包括终止字符在内的若干字符)。如

ighore(5, ′A′)//跳过输入流中5个字符,遇′A′后就不再跳了

也可以不带参数或只带一个参数。如

ignore( )(n默认值为1,终止字符默认为EOF)

相当于

ignore(1,EOF)

2、文件I/O

 所谓“文件”,一般指存储在外部介质上数据的集合。一批数据是以文件的形式存放在外部介质上的。操作系统是以文件为单位对数据进行管理的。

外存文件包括磁盘文件、光盘文件和U盘文件。目前使用最广泛的是磁盘文件。对用户来说,常用到的文件有两大类,一类是程序文件(program file)。一类是数据文件(data file)。程序中的输入和输出的对象就是数据文件。根据文件中数据的组织形式,可分为ASCII文件和二进制文件。

对于字符信息,在内存中是以ASCII代码形式存放的,因此,无论用ASCII文件输出还是用二进制文件输出,其数据形式是一样的。但是对于数值数据,二者是不同的。例如有一个长整数100000,在内存中占4个字节,如果按内部格式直接输出,在磁盘文件中占4个字节,如果将它转换为ASCII码形式输出,则要占6个字节。

C++提供低级的I/O功能和高级的I/O功能。高级的I/O功能是把若干个字节组合为一个有意义的单位,然后以ASCII字符形式输入和输出。所谓低级的I/O功能是以字节为单位输入和输出的,在输入和输出时不进行数据格式的转换。

文件流是以外存文件为输入输出对象的数据流。输出文件流是从内存流向外存文件的数据,输入文件流是从外存文件流向内存的数据。每一个文件流都有一个内存缓冲区与之对应。

文件流本身不是文件,而只是以文件为输入输出对象的流。若要对磁盘文件输入输出,就必须通过文件流来实现。在C++的I/O类库中定义了几种文件类,专门用于对磁盘文件的输入输出操作。

要以磁盘文件为对象进行输入输出,必须定义一个文件流类的对象,通过文件流对象将数据从内存输出到磁盘文件,或者通过文件流对象从磁盘文件将数据输入到内存。正如以标准设备为对象的输入输出中,cin,cout就是流对象,C++是通过流对象进行输入输出的。

1)文件的打开与关闭

文件流可分别对于ifstream 类,ofstream 类和fstream 类说明其对象的方式创建。三个类的构造函数为:

ifstream::ifstream(char * name,int mode=ios::in,int file_attrb =filebuf::openprot);

ofstream::ofstream(char * name,int mode=ios::out,int file_attrb =filebuf::openprot);

fstream::fstream(char * name,int mode,int file_attrb =filebuf::openprot);

//其中openprot=0

第一个参数为文件名字符串(包括路径)。

第二个参数为对文件进行的I/O 模式,其值已在ios 中以枚举方式定义:

enum open-mode{

in=0x01 //用于读入

out=0x02 //用于写出

ate=0x04 //打开并指向文件尾

app=0x08 //用于附加数据打开并指向文件尾

trunc=0x10 //如文件存在则清除其内容

nocreate=0x20 //如文件不存在,则操作失败

noreplace=0x40 //如文件存在,则操作失败

binary=0x80 //二进制(非文本)文件

};

参数mode 可缺省,文件流为输入文件流时,其缺省值为in;为输出文件

流时,缺省值为out。

第三个参数为文件属性(可以缺省),其类型值在filebuf 类中定义,其值

为:

普通文件 0

只读文件 1

隐藏文件 2

系统文件 4

档案文件 8

例如,创建一个输出文件流并输出一串字符可写为:

# include<fstream.h>

void main(){

ofstream output("hello.dat");

output<<"Hello world!"<<endl;

}

C++的I/O 系统为了适应用户的习惯,也提供open 函数和close 函数来完成上述工作,其方式是:用open()和close()来代替构造函数和析构函数。其方法是:

# include<fstream.h>

void main(){

ofstream output;

output.open<<("hello.dat");

output<<"Hello world!"<<endl;

output.close();

}

open 函数的参数与上面关于构造函数的说明一致。

参数中的文件名name 亦可选用设备文件名:

CON:指输入时的键盘,输出时的显示器。

CPT1:指输出的打印机。

COM1,COM2:可用于I/O 的串行口1,2。

使用方法与上面的一致,例如可定义打印机输出流:

ofstream prt("LPT1");

prt<<"to printer"<<endl;

如果把流prt(的地址)赋给流cout:

cout=prt;

则流cout 不再与显示器而是与打印机相连,这时,

cout<<"Hello world!"<<endl;

可由打印机输出。

下面介绍一下Open和Close的用法。

A)打开磁盘文件

    打开文件是指在文件读写之前做必要的准备工作,包括: 

(1) 为文件流对象和指定的磁盘文件建立关联,以便使文件流流向指定的磁盘文件。(2) 指定文件的工作方式。以上工作可以通过两种不同的方法实现。

  • (a)调用文件流的成员函数open。如

ofstream outfile;//定义ofstream类(输出文件流类)对象outfile

outfile.open(″f1.dat″,ios::out);  //使文件流与f1.dat文件建立关联

调用成员函数open的一般形式为

文件流对象.open(磁盘文件名,输入输出方式);

磁盘文件名可以包括路径,如″c:\\new\\f1.dat″,如缺省路径,则默认为当前目录下的文件。

  • (b)在定义文件流对象时指定参数

    在声明文件流类时定义了带参数的构造函数,其中包含了打开磁盘文件的功能。因此,可以在定义文件流对象时指定参数,调用文件流类的构造函数来实现打开文件的功能。如

ostream outfile(″f1.dat″,ios::out);

说明:每一个打开的文件都有一个文件指针;可以用“位或”运算符“|”对输入输出方式进行组合;如果打开操作失败,open函数的返回值为0(假),如果是用调用构造函数的方式打开文件的,则流对象的值为0。

B)关闭磁盘文件

关闭文件用成员函数close。如

outfile.close( );//将输出文件流所关联的磁盘文件关闭

关闭,就是解除该磁盘文件与文件流的关联,原来设置的工作方式也失效。此时可以将文件流与其他磁盘文件建立关联,通过文件流对新的文件进行输入或输出。如outfile.open(″f2.dat″,ios::app|ios::nocreate);

此时文件流outfile与f2.dat建立关联,并指定了f2.dat的工作方式。

发布了208 篇原创文章 · 获赞 30 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/hopegrace/article/details/104219570