c++ I/O(不包括文件)
http://www.cnblogs.com/chinazhangjie/archive/2010/08/19/1803057.html
C++支持两种I/O,1、C语言继承而来 2、有C++定义的面向对象I/O系统。
1、int getchar(void);,返回一个整数值,也可以指定这个值为char变量,行缓冲输入(回车键结束)。如果有错,返回EOF。
2、int putchar(int c); 输出低位字节,放回被写入的字符,失败则返回EOF,
3、int getch(void);
int getche(void);
4、char* gets(char* str);遇到回车键结束,不包含回车键,空结束符放在串尾。注意:没有边界检查,有可能 数组越界
5、int puts(const char* str);只针对字符串打印到屏幕上,相对于printf的开销小,空间少,速度快不能输出数字或者是格式转换。操作失败返回EOF,否则返回非负值。
6、int printf(const char* control_string,...);
(控制串)有两种类型项目组成第一类由将打印在屏幕上的字符串组成,第二类包括自定义其后变元显示方式的格式限定符。格式限定符以一个百分号开头,后跟格式化码,变元列表中的变元数与格式限定符完全相等,格式限定符与变元按顺序从左到右匹配。
7、int scanf(const char* control_string...);
可以读入各种内嵌类型并自动将其转换为适当的格式。返回成功的赋予了一个值的数据项。如果出现一个错误,scanf()返回EOF。控制串包括三类字符:
a、格式限定符 b、空白字符 c、非空白字符
格式限定符以百分号开始,告诉scanf()下一步要读的数据是什么类型。
C++内置流:
cin 标准输入 键盘
cout 标准输出 屏幕
cerr 标准错误输出 屏幕
clog cerr的缓冲版本 屏幕
cin、cout、cerr和C的stdin、stdout、stderr相对应。
C++附加流:win、wout、werr、wlog它们都是款字符版本的标准流,宽字符类型为wchar_t,一般为16位。
29、fmtflags setf(fmtflags flags);
该函数返回格式标记先前的并开启又flags指定的那些标记。
eg:
cout.setf(ios::showpoint);
cout.setf(ios::showpos);
或者cout.setf(ios::showpoint | ios::showpos);
30、void unsetf(fmtflags flags);
flags指定的标记被清除
eg:
cout.setf(ios::uppercase | ios::scientfic);
cout.unsetf(ios::uppercase);
31、fmtflags flags();
返回每个格式标记的当前位置。
32、fmtflags flags(fmtflags f);
设置某个流的所有标记。
eg:
ios::fmtflags f = ios::showpos | ios::showbase | ios::oct | ios::right;
cout.flags(f);//set all flags
33、streamsize width(streamsize w);
修改最小域宽,w是将要改成的域宽,先前的域宽返回。
34、streamsize precision(streamsize p);
当输出浮点型时,可以使用precision()函数来确定数字的精确位数。
35、char fill(char ch);
填充指定字符,默认情况下是空格
C++操作算子
操作算子 用途 输入/输出
boolapha 开启boolapha标记 输入/输出
dec 开启dec标记 输出
endl 输出一个换行符并刷新流 输出
ends 输出一个null 输出
fixed 开启fixed标记 输出
flush 刷新一个流 输出
hex 开启hex标记 输出/输入
internal 开启internal标记 输出
left 开启left标记 输出
noboolalpha 关闭noboolalpha标记 输入/输出
noshowbase 关闭showbase标记 输出
noshowpoint 关闭showpoint标记 输出
noshowpos 关闭showpos标记 输出
noskipws 关闭skipws标记 输入
nounitbuf 关闭unitbuf标记 输出
nouppercase 关闭uppercase标记 输出
oct 开启oct标记 输入/输出
resetiosflags(fmtflags f) 关闭f中指定的标记 输入/输出
right 开启right标记 输出
scientific 开启scientific标记 输出
setbase(int base) 将基数设为base 输入/输出
setfill(int ch) 将填充字符设置为ch 输出
setiosflags(fmtflags f)开启f中指定的标记 输入/输出
setprecision(int p) 设置字符精度 输出
setw(int w) 将域宽设置为w 输出
showbase 开启showbase标记 输出
showpoint 开启showpoint标记 输出
showpos 开启showpos标记 输出
skipws 开启skipws标记 输入
unitbuf 开启unitbuf标记 输出
uppercase 开启uppercase标记 输出
ws 跳过开始的空格 输入
注意:在访问带参数的操算子,必须在程序中包括<iomanip>
创建自己的插入器:
ostream& operator<<(ostream& stream,class_type obj)
{
//body of inserter
return stream;
}
创建自己的析取器
istream& operator>>(istream& stream,class_type obj)
{
//body of extractor
return stream;
}
C++文件的输入和输出<fstream>
创建一个流
ifstream in;//input
ofstream out;//output
fstream io;//input and output
36、
void ifstream::open(const char*filename,ios::opennode mode = ios::in);
void ofstream::open(const char*filename,ios::openmode mode = ios::out | ios::trunc);
void fstream::open(const char* filename,ios::openmode mode = ios::in | ios::out);
openmode:
ios::app 使所有输出到相应文件的内容都添加到文件末尾,该值只能用于具有输出功能的文件。
ios::ate 使得在打开文件时能够定位到文件末尾
ios::binary 可以以二进制文件打开,默认情况下,所有文件都以文本方式打开。
ios::in 指定为输入
ios::out 制定我输出
ios::trunc 销毁具有相同名字的先前文件的内容,并且将文件长度截断为0,当使用ofstream创建一个输出流时任何先前存在的具有该文件名的文件将被自动截断
eg:
if(!mystream)
{
cout<<"Cannot open file.\n";
//handdle error
}
if(!mystream.is_open())
{
cout<<"Cannot open file.\n";
//handdle error
}
37、istream &get(char &ch);
ostream &put(char &ch);
eg:
while(in.get(ch))
cout<<ch;
38、istream& read(char* buf,streamsize num);
ostream& write(const char* buf,streamsize num);
read()函数从流中读取num字符并将他们放入由buf所指的缓冲区。write()函数把num字符从buf所指的缓冲区写入调用流,streamsize是由C++库定义的类型--是某种类型,它可以存储能够被任何一种I/O操作转换的最大字符数。
39、streamsize gcount();
检查已经有多少字符被读取
40、get()的重载版本:
istream& get(char* buf,streamsize num);
把字符读入由buf指向的数组,直到读取到第num-1个字符,发现了一个换行符或者遇到了文件尾。指针buf所指向的数组以null字符结束。
istream& get(char* buf,streamsize num,char delim);
把字符读入由buf指向的数组,直到读取到第num-1个字符,发现了由delim指定的字符或者是遇到了文件尾。指针buf所指向的数组以null字符结束。如果在输入流中遇到分隔符字符,则不会提取该字符。
int get();
返回相应流的下一个字符,如果遇到文件尾,则返回EOF。get()函数的这种形式类似于C的函数
41、istream& getline(char* buf,streamsize num);
把字符读入由buf指向的数组,直到读取到第num-1个字符,发现了一个换行符或者遇到了文件尾。指针buf所指向的数组以null字符结束。如果在出输入流中遇到换行符是,则提取该字符,但是不会将其放入buf
istream& getline(char* buf,streamsize num,char delim);
把字符读入由buf指向的数组,直到读取到第num-1个字符,发现了由delim指定的字符或者是遇到了文件尾。指针buf所指向的数组以null字符结束。如果在输入流中遇到分隔符字符,则提取该字符,但是不将其放入buf
42、bool eof();
到达文件尾时,该函数返回true,否则返回false
43、istream & ignore(streamsize num = 1,int_type delim = EOF);
该函数读取和放弃字符,直到num个字符被忽略(默认值为1)或者遇到delim指定为字符(默认值为EOF)
44、int_type peek();
返回流中的下一个字符,如果遇到文件尾,则返回EOF(int_type 被定义为某种整数型类型)
45、istream& putback(char c);
返回流中的最后一个字符,c是读取最后一个字符
46、ostream& flush();
在缓冲区被写满数据前强行将数据写到磁盘
47、istream& seekg(off_type offset,seekdir origin);
ostream& seekp(off_type offset,seekdir origin);
off_type是ios定义的一个整数类型,可以包含offset具有的最大有效值,seekdir是一个ios定义的枚举类型,用来决定查找方式。seekg()函数可以把相关文件当前的获取指针从指定origin出偏移offset个字符,origin必须是一下三个值中的一个
ios::beg 文件头
ios::cur 当前位置
ios::end 文件尾
seekp()函数可以把相关文件当前的获取指针从指定origin出偏移offset个字符,origin必须是以上三个值之一
48、pos_type tellg();
pos_type tellp();
确定每一个文件指针的位置。pos_type是ios定义的类型,它存储函数可以返回最大值。
I/O状态:保存在一个iostate类型的对象中,它是ios定义的枚举类型,包括一下成员:
ios::goodbit 无错误位设置
ios::eofbit 当遇到文件尾时为1;否则为0
ios::failbit 当出现非致命错误时为1,否则为0
ios::badbit 当出现致命的I/O错误时为1;否则为0
获得I/O状体的方法:
a、iostate rdstate();
b、bool bad();
bool eof();
bool fail();
bool good();
一旦出现错误,或许在程序继续运行之前需要清除该错误,为此,可以使用clear()函数
void clear(iostate flags = ios::goodbit);