流 cout cin
iostream库,用于程序对文件或屏幕的写入或读出。
缓冲区streambuf:流将写入的数据暂时存储到缓冲区中,当缓冲区满才写入磁盘,主要功能包括:填充、清空、清除等。用于向磁盘写数据,防止因磁盘读写降低程序的性能。
ios输入输出基类,包含streambuf;
istream、ostream从ios派生,用于管理输入输出。
iostream从istream、ostream派生,用于向屏幕输入输出。
fstream从istream、ostream派生,用于向磁盘文件输入输出。
标准I/O对象:cin、cout、cerr、clog
重定向:将输入输出发送到与默认设备不同的地方。运算符:重定向输入<,重定向输出>
CIN
cin | 读取字符串时,遇到空格或换行则结束读取,并将读取到的数据作为一个数据。 (cin>>data1)>>data2;//运算符>>返回istream的引用,所以可级联输入。 |
get() | 返回找到的字符,所以不能级联输入。可读取空格字符。如果达到文件结尾则返回EOF(文件结束标志,屏幕输入时,可用CTRL+Z(DOS)或Ctrl + D(Unix)) eg: while((ch = cin.get()) ! = EOF){...} |
get(char) | 返回istream的引用,所以可级联输入。可读取空格字符。 eg: cin.get(ch1).get(ch2);//cin.get(ch1)等价于cin; |
get(char*, maxlen, endchar) | 参数:字符数组指针、读取的字符数+1(最后一个为空字符)、结束字符(默认为'\n') eg: char str[10]; cin.get(str, 10); |
getline(char*, maxlen, endchar) | 参数:字符数组指针、读取的字符数+1(最后一个为空字符)、结束字符(默认为'\n'),注:最后的结束字符会被丢弃,而get读取结束后,结束字符仍留在输入缓冲区。 eg:char str1[10], str2[10]; cin.get(str1, 10); cin.getline(str2, 10); 输入:abc \n 结果:str1 = "abc\0"; str2 = "\0"; 解释:cin.get读取到'\n'时,将缓冲区中的"abc"读取到str1,'\n'未被丢弃,仍在缓冲区中,cin.getline读取到'\n'就结束读取。 解决方法:ignore丢弃缓冲区的结束字符。 |
ignore(maxlen, endchar) | 参数:忽略的字符数、结束字符。忽略行结束EOL或文件结束EOF之前的剩余字符。注:最后的结束字符也会被丢弃。 |
peek() | 查看下一个字符。 eg://字符剔除 while(cin.peek() == "*"){ cin.ignore(1, '*'); } |
putback() | 向输入流中插入一个字符。 eg://字符替换,将*替换为# while(cin.get(ch)){ if(ch == '*') cin.putback('#'); } |
COUT
endl | 清除输出缓冲区。注:调用flush(),也可cout<<flush; |
put | 写单个字符,返回ostream引用,可级联输出。 eg : cout.put('H').put('W'); |
write(char*, maxlen) | 写maxlen个字符。一般情况下:maxlen = strlen(char*); |
width(widthlen) | 设置默认宽度,注:只改变下一个输出字段的宽度,当widthlen大于实际输出宽度时,输出时右对齐,左侧用'\0'填充;当widthlen小于或等于实际输出宽度时,输出时按默认宽度输出。 eg : cout.width(10); cout<<123<<"end\n"; 结果: 123end //有7个空字符 |
fill(newchar) | width()设置的宽度大于实际宽度时,左侧用用newchar填充。注:对以后输出均有效。 eg : cout.width(10); cout.fill('*'); cout<<123<<"end\n"; 结果:*******123end |
setf(flag) | flag : 枚举类型,包括ios::showpoint(显示尾随0)、ios::showpos(打开正数前的加号)、ios::uppercase(大写表示16进制或科学计数法的数)、ios::showbase(显示进制)ios::left、ios::right、ios::internal(输出对其方式)、ios::dec(十进制)、ios::oct(八进制)、ios::hex(十六进制)、ios::scientific(科学计数法表示浮点数)、ios::fixed(十进制表示浮点数)。 eg : int number = 185; cout.setf(iso::showbase); cout<<hex<<number; cout.width(10);//同setw(10); #include <iomanip> cout.setf(ios::right); cout<<hex<<number; 输出:0xb9 0xb9//靠右输出 |
printf
优:可格式化输出字符串
缺:不提供类型的安全性、不支持类打印输出(需逐个变量打印输出)
#include<stdio.h>
返回输出的字符个数
格式:%[flags][width][.prec][F|N|h|l]type
flags:输出样式
- | 左对齐,右边填充空格,注:默认情况下右对齐,左侧填充空格 |
+ | 显示数据正负 |
0 | 左侧填充0,直到填满指定列宽 |
| 显示正数时为空格,负数时为-号 |
# | type是0、x、X时增加前缀0、0x、0X type是e、E、f、g、G时使用小数点 type是g、G时尾部0保留 |
type:输出数据类型
s/S | 字符串 |
c | 字符 |
d | 整型 |
o | 无符号8进制整数 |
u | 无符号10进制整数 |
f/lf | 浮点数 |
e/E | 浮点数,科学计数法 |
g/G | f或e的最短形式,小数4位或指数大于等于精度时用e |
p | 16进制输出指针 |
n | 到此字符前为止,输出的字符个数,不输出文本 |
eg.
%10.5f | //输出浮点数,宽度为10,小数部分宽度为5,靠右输出,左侧填空格,右侧填0 |
%5d | //输出整数,宽度为5,靠右输出,左侧填空格 |
转义字符
\a | 铃声 |
\b | backspace |
\f | 换页 |
\n | 换行 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符 |
\ooo | 八进制ASCII |
\xhh | 十六进制ASCII |
\xhhhh | 十六进制宽字符或Unicode字符 |
文件输入输出
#include<fstream.h>
eof()//文件是否结束EOF
bad()//文件是否有非法操作
fail()//文件操作是否失败或者有非法操作
good()//文件操作正常
eg.
//写入文件
ofstreamfout("xxx.txt");
fout<<"This is written to the file…\n";
fout.close();
//从文件读出
ifstreamfin("xxx.txt");
while(fin.get(ch)){
cout<<ch;}
fin.close();
ofstream打开文件参数
open(filename,mode, prot);
mode:打开文件方式
ios::app | //append,从文件末尾写入 |
ios::ate | //at end,指向文件末尾,但可在任意位置写入 |
ios::trunc | //truncate,默认,清除文件内容 |
ios::nocreate | //不创建文件,即文件不存在则打开失败 |
ios::noreplace | //不覆盖文件,文件存在则打开失败 |
prot:打开的文件属性
0--普通文件,1--只读文件,2--隐含文件,4--系统文件
eg.
//二进制文件与结构体数据
XXX xxx;
ofstreamfout("xxx.dat", ios::binary);
fout.write((char*)&xxx,sizeof(XXX));
fout.close();
XXX xxx2;
ifstreamfin("xxx.dat", ios::binary);
fin.read((char*)&xxx2,sizeof(XXX));
fin.close();
注:文件是否打开需进行判断,if(fin)同if(fin.good())
程序启动参数
//argc 启动参数个数,argv启动参数字符串数组指针
void main(intargc, char **argv);
命名空间
用于避免命名冲突。
编译器不能检查不同编译单元之间的命名冲突,而是由链接器进行检查。
namespaceSpace1{
void method1();//命名空间内所有成员都是public的
class Class1{void method2();};
}
voidSpace1::method1(){}
voidSpace1::Class1::method2(){}
命名空间嵌套:
namespaceSpace1{
namespace Space2{
void method1();
}
}
voidSpace1::Space2::method1(){}
usingnamespace Space1;//将Space1命名空间放到当前作用域。
usingnamespace Space1::
eg.
namespaceSpace1{
int Value1 = 10;
int Value2 = 20;
int Value3 = 30;
}
voidmethod1(){
int Value1 = 1;//隐藏Space1中的Value1
using namespace Space1;
int Value3 = 3;//error,重定义出现歧义
cout<<"value1:"<<Value1<<endl;
cout<<"value2:"<<Value2<<endl;
cout<<"value3:"<<Value3<<endl;//此处会报错
}
命名空间别名:
namespaceSpace1{
int Value1 = 10;
}
namespaceNewSpace = Space1;//NewSpace为Space1的别名
未命名的命名空间:
常用于防止全局数据在编译单元间产生牵制的命名冲突。
namespace{
int Value1 = 10;
}
引入命名空间:
usingnamespace命令将引入命名空间的所有东西,所以尽量使用using而不是using namespace。
eg.
using namespace std; | //引入std命名空间的所有东西 |
using std::cout; | //只引入cin |
using std::cin; | //只引入cout |