程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++ IO 詳細用法

C++ IO 詳細用法

編輯:C++入門知識

http://www.cnblogs.com/keam37/ keam所有 轉載請注明出處

本文將分別從<iostream>,<sstream>,<fstream>,<iomanip>4個頭文件介紹包含在其中的函數的用法.

#inclde<iostream>

    cin,cout,cerr是最基本的輸入輸出流 ,通過運算符"<<"和 “>>”操作

    例如從鍵盤讀入兩個字符串,再將其合並輸出

string s1,s2;

cin>>s1>>s2;

cout<<s1+' '+s2;

if(!cin)

cerr<<"input error";

 

  運行輸入為 :

Hello

keambar

  則會輸出:

Hello keambar

如果直接輸入文件結束符   ctrl+z

        則會輸出 “input error”

 

這裡與if(!cin) 有關的是操縱流的條件狀態

有以下幾種狀態(flag)

badbit           代表流已經崩潰

failbit            表示一個IO操作失敗

eofbif           表示流到達文件結束

goodbit       值為0, 表示沒有錯誤

定義 istream s;//s是一個輸入流

s.bad()               對應badbit,如果badbit置位,返回true;

s.eof()                對應eofbit狀態,如上;

s.fai()                 對應failbit,如上;

s.good()            對應goodbit,如上;

s.clear()             復位所有錯誤狀態,如果加上參數如s.clear(failbit)則僅復位failbit;

s.setstate(flag)  將流s的狀態復位為給定狀態;

s.rdstate()          返回當前s流的狀態,返回值為 flag;

下面的例子來自C++primer:

 

auto old_state = cin.rdstate(); //記住cin的當前狀態

cin.clear(); //使cin有效

process_input (cin); //使用cin

cin.setstate (old_state) ; //將cin置為原狀態

如果程序崩潰,輸出緩沖區將不會刷新,可能導致不會輸出程序執行結果.

 

刷新輸出緩沖區的方法

cout<<”hi”<<endl;  輸出字符串加上換行,然後刷新;

cout<<”hi”<<flush;輸出字符串,然後刷新;

cout<<”hi”<<ends;輸出字符串加上一個空字符,然後刷新;

   unitbuf 操作符

   cout<<unitbuf //所有輸出操作後都會立即刷新;

   cout<<nounitbuf //取消上述操作

關聯輸入和輸出流

默認情況下 cin和cerr 都關聯到cout,因此讀cin或寫cerr 都會刷新cout;

x.tie(&O)             將x關聯到輸出流O;

x.tie()                   返回x當前關聯的輸出流指針,若沒有關聯到輸出流則返回空指針;

其他操作

cout.put(char ch)                                             //將字符ch加入輸出流

cin.putback(char ch)                                      //將字符ch加入輸入流;

cin.get(char *s,streamsize num,char delim)//從cin流讀入字符串,從字符串的首指針,長度為num,或讀到 delim結束,第三個參數可不帶

getline(cin,string s,char delim)                   //從cin流讀入一行,放入字符串中,遇到行結束或讀到delim結束,默認delim=‘\n’

cin.ignore( streamsize num=1, int delim ); //從cin流讀入數,長度為num,或讀到delim結束,默認為換行;

 

//在使用get後可以使用 cin.gcount( )返回 已經讀入的字符數

    例如

 

char c[10];

cin.get ( &c[0], 9 );

cout << c << endl;

cout << cin.gcount( ) << endl;

/*==============================/*

#include<sstream>

  stringstream s;//定義一個字符串流s

  stringstream s(“keambar”);//定義一個已近寫入”keambar”的字符串流;

     s>> 從字符串s讀入數據

     s<<將字符寫入s;

  sstream操作雖然簡單,但十分實用,具體用法和方便之處自行體會 :)

<iostream>大部分輸入輸出操作都可以對stringstream使用

/*==============================/*

#inclde<fstream>

    ifstream read("in.txt");    //打開文件in.txt
    ofstream write("out.txt");//打開文件out.txt 若無則將創建

   read>>    //從文件讀入

   cout<<    //輸出到文件

   read.close();// 關閉與read綁定的文件;

   read.open("in2.txt");//重新將read與in2.txt綁定;

   read.is_open()//返回bool值,指出與s綁定的文件是否已近打開;

文件模式(mod)s.open(文件名,mod)

  in                 以讀方式打開

  out              以寫方式打開

  app             每次寫操作定位到文件末尾

  ate               打開後定位到文件末尾

  trunc           截斷文件

  binary          以二進制方式打開

默認使用oftream    以out方式打開,並且截斷文件,要保留原內容需要用app模式

下面內容來自文檔     seekg()/seekp()與tellg()/tellp()的用法詳解

seekg()/seekp()與tellg()/tellp()的用法詳解

對輸入流操作:seekg()與tellg()

對輸出流操作:seekp()與tellp()

下面以輸入流函數為例介紹用法:

seekg()是對輸入文件定位,它有兩個參數:第一個參數是偏移量,第二個參數是基地址。

對於第一個參數,可以是正負數值,正的表示向後偏移,負的表示向前偏移。

而第二個參數可以是:

ios::beg:表示輸入流的開始位置

ios::cur:表示輸入流的當前位置

ios::end:表示輸入流的結束位置

tellg()函數不需要帶參數,它返回當前定位指針的位置,也代表著輸入流的大小。

其他操作

peek()  //peek函數用於讀取並返回下一個字符,但並不提取該字符到輸入流中,也就是說,依然讓該字符作為將要提取到輸入流的下一個字符。

例如下面來自 http://www.cplusplus.com/reference/istream/istream/peek/的例程

// istream::peek example

#include <iostream> // std::cin, std::cout

#include <string> // std::string

int main () {

	std::cout << "Please, enter a number or a word: ";

	char c = std::cin.peek();

	if ( (c >= '0') && (c <= '9') )

	{
              int n;

		std::cin >> n;

		std::cout << "You entered the number: " << n << '\n'; 15
	}
	else
	{

		std::string str;

		std::getline (std::cin, str);
		
		std::cout << "You entered the word: " << str << '\n';
	}
	return 0;

}

cin.read(char* buffer, streamsize num ) //按字節讀入

cin.write(const char* buffer, streamsize num )//按字節輸出

例如

struct {

       int height;

	int width;

} rectangle;

input_file.read ( (char *) (&rectangle), sizeof (rectangle) );

if ( input_file.bad() ) {

	cerr << "Error reading data" << endl;

	exit ( 0 );

}

/*==============================/*

#inclde<iomanip>

涉及到格式化輸出,不僅僅使用<iomanip>頭文件,也將包含<iostream>

<iostream>中有

cout.fill(char ch)                         // 將填充字符設置為 ch

cout.fill()                                     //返回當前填充字符

cout.width(int k)                       //將輸出寬度設置為k,設置僅對下次輸出有效

例如

 

cout << 32 << endl;

cout.width (5);

cout << 32 << endl;

cout << 32 << endl;

cout.fill ('#');

cout.width (5);

cout << 32 << endl;

cout << cout.fill() << endl;

 

將輸出

32
       32
32
###32
#

cout.flags()         //返回int值,表示當前格式

cout.precision(int k) //保留k位有效數字,不加參數返回int值,表示當前設置

cout.setf(ios::   )  //開啟格式 flag

ios格式

boolalpha          //按bool值輸出"true" 或 "false".

dec                     //以10進制輸出.

hex                    //以16進制表示整數.

oct                   //以8進制表示整數

fixed                  //將符點數按照普通定點格式處理(非科學計數法)

internal            //在符號位和數值的中間插入需要數量的填充字符以使串兩端對齊

left                   //在串的末尾插入填充字符以使串居左對齊

right                //在串的前面插入填充字符以使串居右對齊

scientific        // 將符點數按照科學計數法處理(帶指數域)

showbase      //為整數添加一個表示其進制的前綴

showpoint     //在浮點數表示的小數中強制插入小數點(默認情況是浮點數表示的整數不顯示小數點)

showpos        //強制在正數前添加+號

skipws            //忽略前導的空格

unitbuf           //前面已近介紹過,在插入(每次輸出)操作後清空緩存

uppercase     //強制大寫字母

下面來自http://www.cnblogs.com/devymex/archive/2010/09/06/1818754.html

更多操作也可參考其中

以上每一種格式都占用獨立的一位,因此可以用“|”(位或)運算符組合使用。調用setf/unsetf或flags設置格式一般按如下方式進行:

cout.setf(ios::right | ios::hex); //設置16進制右對齊

cout.setf(ios::right, ios::adjustfield); //取消其它對齊,設置為右對齊

setf可接受一個或兩個參數,一個參數的版本為設置指定的格式,兩個參數的版本中,後一個參數指定了刪除的格式。三個已定義的組合格式為:

  • ios::adjustfield  對齊格式的組合位
  • ios::basefield  進制的組合位
  • ios::floatfield  浮點表示方式的組合位

另外

         cout.flag的操作有如下用法

int number = 32;
cout.setf (ios::showbase); //設置為顯示進制前綴
//setw()函數在<iomanip>中,包括直接使用<<hex
cout << setw (6) << hex << 32 << setw (6) << oct << 32 << endl; 
cout << number << endl;//此時輸出按照最近一次輸出的格式輸出
auto p = cout.flags();//用p記錄當期的格式 cout.unsetf(ios::oct);//取消8進制輸出
cout << number << endl;
cout.flags (p); //設置為格式p
cout << number << endl;
return 0;

 

輸出為

0x20    040
040
32
040

參考資料 c++ primer,c++ Reference

 

 

 

 

 

 

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved