21天學通C++--閱讀筆記5(輸入輸出、命名空間)

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章