21天学通C++--阅读笔记5(输入输出、命名空间)

来源:互联网 发布:excel筛选文本数据 编辑:程序博客网 时间:2024/04/30 11:21

cout cin

iostream库,用于程序对文件或屏幕的写入或读出。

缓冲区streambuf:流将写入的数据暂时存储到缓冲区中,当缓冲区满才写入磁盘,主要功能包括:填充、清空、清除等。用于向磁盘写数据,防止因磁盘读写降低程序的性能。

 

ios输入输出基类,包含streambuf;

istreamostreamios派生,用于管理输入输出。

iostreamistreamostream派生,用于向屏幕输入输出。

fstreamistreamostream派生,用于向磁盘文件输入输出。

 

标准I/O对象:cincoutcerrclog

 

重定向:将输入输出发送到与默认设备不同的地方。运算符:重定向输入<,重定向输出>

 

CIN

cin

读取字符串时,遇到空格或换行则结束读取,并将读取到的数据作为一个数据。

(cin>>data1)>>data2;//运算符>>返回istream的引用,所以可级联输入。

get()

返回找到的字符,所以不能级联输入。可读取空格字符。如果达到文件结尾则返回EOF(文件结束标志,屏幕输入时,可用CTRL+ZDOS)或Ctrl + DUnix))

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::leftios::rightios::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,直到填满指定列宽

 

显示正数时为空格,负数时为-

#

type0xX时增加前缀00x0X

typeeEfgG时使用小数点

typegG时尾部0保留

 

type:输出数据类型

s/S

字符串

c

字符

d

整型

o

无符号8进制整数

u

无符号10进制整数

f/lf

浮点数

e/E

浮点数,科学计数法

g/G

fe的最短形式,小数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;//NewSpaceSpace1的别名

 

未命名的命名空间:

常用于防止全局数据在编译单元间产生牵制的命名冲突。

namespace{

int Value1 = 10;

}

 

引入命名空间:

usingnamespace命令将引入命名空间的所有东西,所以尽量使用using而不是using namespace

eg.

using namespace std;

//引入std命名空间的所有东西

using std::cout;

//只引入cin

using std::cin;

//只引入cout

0 0
原创粉丝点击