21天学通C++--阅读笔记5(输入输出、命名空间)
来源:互联网 发布:excel筛选文本数据 编辑:程序博客网 时间:2024/04/30 11:21
流 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
- 21天学通C++--阅读笔记5(输入输出、命名空间)
- ROS进二阶学习笔记(5)- 命名与命名空间
- 《C++ primer》英文第五版阅读笔记(八)——声明命名空间
- C++namespace(命名空间)
- 【C#】 命名空间(Namespace)
- c++基础知识(命名空间、输入输出流、重载、缺省、引用)
- C/C++:命名空间
- C++(笔记)输入输出总结
- 综合:bool类型 命名空间 输入输出
- C++基础(1)--输入输出与命名空间
- C++学习笔记1(结构体,命名空间,标准输入输出,引用,函数,构造函数)
- C++ primer第二次阅读学习笔记(第17章:用于大型程序的工具:命名空间)
- c++==命名空间(5)
- 一周学会C#(命名空间)
- 一周学会C#(命名空间)
- C++-namespace命名空间(转)
- C++(4):C++命名空间
- C++-namespace(命名空间)
- 21天学通C++--阅读笔记4(静态成员、函数指针)
- SharePoint 2013+ Sqlserver 2014 Kerberos (错误的解决方法)
- BZOJ-1009-GT考试-HNOI2008
- ping命令详解
- Delphi 中的容器类
- 21天学通C++--阅读笔记5(输入输出、命名空间)
- Android 自定义View (四)
- OJ 38之最大公约数和最小公倍数
- Composer 安装方法
- 断点调试
- Xcode 快捷键大全
- 21天学通C++--阅读笔记6(模板、标准模板库)
- iOS/iPhone学习系列、代码教程----~~~持续更新中~~~
- Java基础视频教程第18天_其他常用对象、IO流一