1.C++中,输入输出操作是一种基于字节流的操作。输入时,可把输入的数据看出逐个字节的从外设流入内存;输出时,把输出的数据看成逐个字节从内存流到外设。C++标准库中,除了提供基于字节的输入输出外,为方便使用,还提供基于C++基本数据类型的输入输出操作。另外在C++程序中,也可以对类库中的输入输出类的一些操作进行重载,使其能对自定义对象进行输入输出操作
2.输入输出操作分为基于控制台的I/O(标准输入输出设备),基于文件的I/O,基于字符串的I/O;
3.C++支持过程式和面向对象两种程序设计范型。以过程式的方式进行输入输出是通过保留C语言的输入输出函数实现;面向对象方式是通过C++的类库实现,ios是一个基类,其他类均由它派生。
4.控制台I/O:
(1)基于I/O函数库的控制台I/O:头文件cstdio或stdio.h
1)输出:
int putchar(int ch);
int puts(const char *p);
int printf(const char *format[,<参数表>]);
2)输入:
int getchar();
char *gets(char *p);
int scanf(const char *format[,<参数表>]);//scanf格式字符串中的普通字符不是作为输出,而是用于与输入字符匹配,输入时,除了输入控制字符所规定的数据外,还需输入格式串中的普通字符。scanf识别某个指定类型的数据,遇到指定的字符或空白符或不可识别字符时终止。对于字符串类数据,输入过程直到读入空白符为止,并自动在读入的字符串后面加一个/0,如果输入包含空格的字符串,则相应的格式控制字符串%s应写成%[...],并把允许在输入字符串中出现的字符逐个列在方括号中,对于字面和数字,可以用-来缩写。如:
char s[10];
scanf("%[a-zA-Z0-9 ]",s);
scanf("%9s",s);//把输入前9个字符
前面三个输入函数时带输入缓冲的,输入的数据并不直接放入程序的变量中,而是先放在系统的换成区中,当键入回车时,数据才放入变量中。有些系统提供不带输入缓存的函数,如:
int getch();//不带缓冲字符输入,输入字符不回显显示器
int getche();//不带缓冲的字符输入,输入的字符回显到显示器
(2)基于I/O类库的控制台I/O:
1)预定义的控制台对象:I/O类库中预定义了4个I/O对象:cin(istream对象),cout,cerr,clog(这三个都是ostream对象),利用这些对象可以直接控制台进行输入输出。cerr,clog对应计算机系统的用于输出程序错误信息的设备,cerr,clog不受输出重定向的影响,cerr不对输出缓存。这四个对象在<iostream>中声明
2)输出:可通过cout,cerr,clog和<<进行输出,为了对输出格式进行控制,可通过操作符来实现,在头文件<iomanip>中,常用的如下:
endl,dec,oct,hex
flush(缓存内容立即输出)
setprecision(int n)(设置小数点后数字的位数),setiosflags(long flags)(设置输出格式,ios::scientific(以指数形式显示浮点数),ios::fixed(以小数点形式显示浮点数))
setiosflags(ios::left) 左对齐
setiosflags(ios::right) 右对齐
setiosflags(ios::skipws) 忽略前导空白
setiosflags(ios::uppercase) 16进制数大写输出
setiosflags(ios::lowercase) 16进制小写输出
setiosflags(ios::showpoint) 强制显示小数点
setiosflags(ios::showpos) 强制显示符号
setw(int n)(设置域宽,默认右对齐)
setfill(int fill)(设填充字符)
此外,还可通过ostream类提供的一些基于字节流的操作来进行输出
ostream& ostream::put(char ch);
ostream& ostream:write(const char *p,int count);
3)输入:通过cin和>>进行输入
char str[10];
cin>>setw(10)>>str;//把输入前9个字符和/0放入字符串中
此外,还可通过istream类的基于字节流的成员函数来进行输入
istream::get(char &ch);
istream::getline(char *p,int count,char delim='/n');
istream::read(char *p,int count);
5.文件I/O:c++中,把文件看成是由一系列字节所构成的字节串,称为流式文件,对文件中数据的操作通常是逐个字节的顺序进行。文件中,数据的存储方式有两种:文件方式(txt)和二进制方式(binary)。文件文件中只包含可显字符和有限的几个控制字符(如/r,/n,/t等),一般用于存储具有行结构的数据,如源程序以及纯文本格式数据等;而二进制文件中可包含任意的二进制字节,一般用于存储无显式结构的数据,如目标代码以及二进制数据等。如整数1234567,在文本方式中,依次把1,2,3,4,5,6,7的ASCII码:31,32,33,,34,35,36,37(十六进制,共7个字节)写入文件;在二进制方式中,把整数1234567的计算机(假设为32位计算机)内部表示0012D687(十六进制,共4个字节)写入文件。
(1)基于I/O函数库的文件I/O:在头文件<cstdio>或<stdio.h>中,文件的输入输出数据的存储方式和类型要对应,否则可能得不到准确的数据
typedef struct
{
short level;//缓冲区满或空的程度
unsigned flags;//文件状态标志
char fd;//文件描述符
unsigned char hold;如无缓冲区不读字符
short bsize;//缓冲区大小
unsigned char *buffer;//数据缓冲区位置
unsigned char *curp;//指针,当前的指向
unsigned istemp;//临时文件,指示器
short token;//用于有效性检查
}FILE;
1)文件输出:
FILE *fopen(const char *filename, const char *mode);//mode可以为:w,打开外部文件用于写,如果已存在,将内容清楚,如果不存在,创建该文件;a,打开外部文件用于添加操作,如果不存在,创建之;在w,a的后面可以加上b,指出以二进制方式打开文件,默认为文件方式。对以文本方式打开的文件,当输出的字符为/n时,某些平台将自动转换成/r,/n两个字符写入外部文件
int fputc(int c,FILE *stream)
int fputs(const char *string,FILE *stream);
int fprintf(FILE *stream,const char *format[,argument]...);
size_t fwrite(const void *buffer,size_t size,size_t count,FILE *stream);//按字节输出数据,size为字节块的尺寸,count为字节块的个数
前三个主要用于以文件方式输出数据,第四个用于以二进制方式输出数据
2)文件输入:
FILE *fopen(const char *filename,const char *mode);//mode可以为:r,表示打开一个外部文件用于读,外部文件必须存在。可以在r后加b,指出以二进制方式打开文件。默认打开方式为文本文件。对以文件方式打开的文件,进行输入操作时,外部文件中连续的两个字符/r,/n将自动转换成一个字符/n(在某些平台上)。读入0x1A(ctrl+Z)表示文件结束
int fgetc(FILE *stream);
char *fgets(char *string,int n,FILE *stream);
int fscanf(FILE *stream,const char *format[,argument]...);
size_t fread(const void *buffer,size_t size,size_t count,FILE *stream);//size为字节块的尺寸,count为字节块的个数
int feof(FILE *stream)
int fclose(FILE *stream)
3)文件输入输出操作:
FILE *fopen(const char *filename,const char *mode);//mode可以是:r+,打开一个外部文件供读写,文件必须存在;w+,打开一个外部文件供读写,如果不存在,创建之。否则,清空文件内容;a+,打开外部文件用于读/添加操作。如果文件不存在,创建之。否则,在文件尾追加。可以在a+,w+,r+后加上b,表示以二进制方式打开,默认是文本方式
4)随机输入输出操作:文件位置指针可用fseek函数来指定,避免顺序访问降低效率
int fseek(FILE *stream,long offset,int origin);//origin:SEEK_CUR或SEEK_END或SEEK_SET(文件头);offset:移动字节数,可为正负。函数返回值为0表示移动成功,否则表示失败。
long ftell(FILE *stream);//返回文件当前指针
(2).基于I/O类库的文件I/O:头文件<iostream>,<fstream>
1)输出:创建一个ofstream类(ostream类派生类)对象,使其与外部文件建立联系
直接方式:ofstream out_file(const char* szName, int nMode = ios::out);
间接方式:ofstream out_file;out_file.open(<文件名>,<打开方式>);//打开方式:ios::out,与w相同;ios::app,与a相同。可与ios::binary进行或,表示以二进制打开,默认是文本打开。
判断文件是否打开:if(!out_file),if(out_file.fail()),if(!out_file.is_open())
打开后,可用<<操作符或ofstream类的一些成员函数进行输出操作。如:
ofstream out_file("a.txt",ios::out);
if(!out_file)
exit(-1);
int x;
double d;
...
out_file<<x<<','<<d;
out_file.put('A');
out_file.write("ABCDEFG",7);
文件关闭:out_file.close();
2)输入:创建ifstream(fstream类派生类)对象。使其与外部文件关联
直接方式:ifstream in_file(<文件名>,<打开方式>);
间接方式:ifstream in_file;in_file.open(<文件名>,<打开方式>);//打开方式:ios::in,与r相同。可与ios::binary或,实现二进制打开
打开后,可通过<<操作符或ifstream类的成员函数实现输入操作,如:
ifstream in_file("a.txt",ios::in);
if(!in_file)
exit(-1);
char ch,buf[11];
int x;
double d;
in_file>>x>>y;
in_file.get(ch);
in_file.read(buf,7);
in_file.close();
文件结束判断:int ios::eof();//0表示文件未结束,非0表示文件结束
3)输入输出:创建fstream类(类iostream派生类)对象
fstream io_file(<文件名>,<打开方式>);//打开方式:ios::in | ios::out,任意位置读写;ios::in | ios;:app,文件末尾写
4)随机存取文件:
以输入方式打开的文件,可用如下指定文件内部指针位置:
istream &istream::seekg(<位置>);//指定绝对位置
istream &istream::seekg(<偏移量>,<参照位置>);//指定相对位置,参照位置可以是;ios::beg,ios::cur,ios::end;
istream &istream::tellg();//获得指针位置
对于输出文件,可用下面操作指针文件内部指针:
ostream &ostream::seekp(<位置>);
ostream &ostream::seekp(<偏移量>,<参照位置>);
ostream &ostream::tellp();
6.字符串I/O:
基于字符串变量的输入/输出功能的库函数主要是:
int sprintf(char *buffer,const char *format[,argument]...);
int sscanf(const char *buffer,cosnt char *format[,argument]...);
基于I/O类库的字符串变量的输入/输出操作:首先创建istrstream(新标准为istringstream)、ostrstream(ostringstream)或strstream(stringstream)类的一个对象
#include<iostream>
#include<strstream>
ostrstream str_buf;
或
char buf[100];
ostrstream str_buf(buf,100);
第一种创建方式采用动态扩充的内部缓冲。第二种采用程序提供的缓存buf
使用<<操作符或ostrstream类的其他操作可进行基于str_buf对象的输出操作,如:
int x,y;
...
str_buf<<x<<y<<endl;
char *p=str_buf.str();
#include<iostream>
#include<strstream>
char buf[100];
...
istrstream str_buf(buf);
或
istrstream str_buf(buf,100);
使用>>操作符或istrstream其他函数可进行基于str_buf的输入操作
int x,y;
str_buf>>x>>y;