1. 程式人生 > >c++輸入輸出流操作筆記

c++輸入輸出流操作筆記

1.流的控制


iomanip          在使用格式化I/O時應包含此標頭檔案。
stdiostream   用於混合使用C和C + +的I/O機制時,例如想將C程式轉變為C++程式

2.類繼承關係


ios是抽象基類,由它派生出istream類和ostream類, iostream類支援輸入輸出操作,iostream類是從istream類和ostream類通過多重繼承而派生的類


類ifstream繼承了類istream,類ofstream繼承了類ostream,類fstream繼承了 類iostream


iostream標頭檔案中4種流物件


物件        含義        對應裝置        
對應的類


c語言中相應的標準檔案
cin        標準輸入流        鍵盤        istream_withassign        stdin
cout        標準輸出流        螢幕        ostream_withassign        stdout
cerr        標準錯誤流        螢幕        ostream_withassign        stderr
clog        標準錯誤流        螢幕        ostream_withassign        stderr
cout補充


1、用“cout<<”輸出基本型別的資料時,可以不必考慮資料是什麼型別,系統會判斷資料的型別並根據其型別選擇呼叫與之匹配的運算子過載函式。這個過程都是自動的,使用者不必干預。如果在C語言中用prinf函式輸出不同型別的資料,必須分別指定相應的輸出格式符,十分麻煩,而且容易出錯。
2、cout流在記憶體中對應開闢了一個緩衝區,用來存放流中的資料,當向cout流插 人一個endl時,

不論緩衝區是否已滿,都立即輸出流中所有資料,然後插入一個換行符, 並重新整理流(清空緩衝區)。注意如果插人一個換行符”\n“(如cout<<a<<“\n”),則只輸出和換行,而不重新整理cout 流(但並不是所有編譯系統都體現出這一區別)。

3、在iostream中只對”<<“和”>>”運算子用於標準型別資料的輸入輸出進行了過載,但未對使用者宣告的型別資料的輸入輸出 進行過載。如果使用者聲明瞭新的型別,並希望用”<<“和”>>”運算子對其進行輸入輸出,按照重運算子過載來做。cout 流通常是傳送到顯示器輸出,但也可以被重定向 輸出到磁碟檔案,而cerr流中的資訊只能在顯示器輸出cerr是不經過緩衝區,直接向顯示器上輸出有關資訊,而clog中的資訊存放在緩衝區中,緩衝區滿後或遇endl時向顯示器輸出

3、標準輸入流 cin
重點掌握的函式

cin.get()                 //讀入一個字元並返回它的值
cin.get(一個引數)  //讀入一個字元並把它儲存在ch
cin.get(兩個引數)  //可以讀取字串
cin.get(三個引數)  //可以讀字串
cin.getline()
cin.ignore()           //讀取字元並忽略指定字元
cin.peek()            //檢查下一個輸入的字元,不會把字元從流中移除cin.putback()       //返回一個字元給一個流

重要
1、使用cin,從流中讀出的字元,流中就沒有這字元了,再次讀取時只能讀取剩下的
2、緩衝去只有在遇到EOF、手動敲回車、流(快取區)滿時,才將流中的字元全部讀出(即清空快取區)

練習
1、從流中取一個字元,然後在放進去;
2、判斷流中的第一個字元是不是放進去的那個字元;
3、從流中讀取10個字元;
4、從流中忽略5個字元,再讀取10個字元;
5、最後讀取剩下的字元,最後輸出讀到的所有字元

#include <iostream>
using namespace std;

int main()
{
        char ch1;
        int look;
        char str1[11] = {0};
        char str2[11] = {0};
        char str3[100] = {0};
        
        //從流中取一個字元,然後在放進去
        ch1 = cin.get();
        cin.putback(ch1);

        //判斷流中的第一個字元是不是放進去的那個字元
        look = cin.peek();
        if(look == (int)ch1)
        {
                cout<<"cin.peek()放進去的字元在第一個位置"<<endl;
        }
 	else
        {
                cout<<"cin.peek()放進去的字元不是在第一個位置"<<endl;
        }

        //從流中讀取10個字元
        cin.get(str1,11);

        //從流中忽略5個字元,再讀取10個字元
        cin.ignore(5);
        cin.get(str2,11,EOF);

        //最後讀取剩下的字元,最後輸出讀到的所有字元
        cin.getline(str3,100);

        //輸出讀到的資料
        cout<<"第一個字元"<<ch1<<endl;
        cout<<"第一組 字串:"<<str1<<endl;
        cout<<"第二組 字串:"<<str2<<endl;
        cout<<"剩下的字串:"<<str3<<endl;

        system("pause");
        return 0;
}
複製程式碼
輸出:
0123456789abcde9876543210zzzzzzzzzzxxxxxxxxxxxxxyyyyyyyyyyyy
cin.peek()放進去的字元在第一個位置
第一個字元0
第一組 字串:0123456789
第二組 字串:9876543210
剩下的字串:zzzzzzzzzzxxxxxxxxxxxxxyyyyyyyyyyyy
複製程式碼

4.標準還輸出流cout

流成員函式

cout.flush()      //清空緩衝區
cout.put()        //把字元寫入流中
cout.write()      //將字串寫入當前輸出流中

eg : cout.setf( ios::dec );


cout.setf(ios::hex,ios::basefield);【建議使用這種】


需注意:


1、fmtflags setf( fmtflags flags ); 使用這種,一定要先取消當前基【cout.unself()】,之後才可以設定新的基


2、fmtflags setf( fmtflags flags, fmtflags needed ); 使用這種,第二個引數設為當前的基,或者當不知道當前基時,設為ios_base::basefield清除當前的所有可能的基


  控制符,標頭檔案<iomanip>


eg:  cout<<setw(5);


5、檔案I/O


由於檔案裝置並不像顯示器螢幕與鍵盤那樣是標準預設裝置,不能像cout那樣預先定義的全域性物件,所以我們必須自己定義一個該類的物件。


ifstream類,它是從istream類派生的,用來支援從磁碟檔案的輸入。


ofstream類,它是從ostream類派生的,用來支援向磁碟檔案的輸出。


fstream類,它是從iostream類派生的,用來支援對磁碟檔案的輸入輸出。


檔案原理


檔案開啟都有一個檔案指標,該指標的初始位置由I/O方式指定,每次讀寫都從檔案指標的當前位置開始。每讀入一個位元組,指標就後移一個位元組。當檔案指標移到最後,就會遇到檔案結束EOF(檔案結束符也佔一個位元組,其值為-1),此時流物件的成員函式eof的值為非0值(一般設為1),表示檔案結束 了。


檔案關閉,實際上是解除該磁碟檔案與檔案流的關聯,原來設定的工作方式也失效,這樣,就不能再通過檔案流對該檔案進行輸入或輸出


檔案型別:

1、ASCII檔案:檔案的每一個位元組中均以ASCII程式碼形式存放資料,即一個位元組存放一個字元,這個檔案就是ASCII檔案(或稱字元檔案)。


2、二進位制檔案:檔案中的資訊不是字元資料,而是位元組中的二進位制形式的資訊,因此它又稱為位元組檔案


常用函式


開啟檔案:



方式1:對檔案輸出流、檔案流物件,通過ofstream類的建構函式開啟檔案

格式: ofstream (磁碟檔名, 輸入輸出方式);

如果ofstream  為0(假),表示開啟操作失敗

如:   ofstream fout1(fname,ios:ut);

輸入輸出方式可以使用能夠進行組合使用的,以“或”運算(“|”)的方式,如:fstream fout(fname,ios:ut|ios::in)

方式2:對檔案的輸出和輸入流物件、檔案流物件,都可通過open函式開啟檔案

格式: 檔案流物件.open(磁碟檔名, 輸入輸出方式);

返回值:為0(假),開啟操作失敗

如:   fout.open(fname,ios:ut)

關閉檔案:

在對已開啟的磁碟檔案的讀寫操作完成後,必須要關閉該檔案  如:  outfile.close( );

檔案操作

1、可以用流插入運算子“<<”和流提取運算子“>>”輸入輸出標準型別的資料(>> 讀出時在遇空格、換行都結束)。

2、也可以用檔案流的put、get、geiline等成員函式進行字元的輸入輸出。

#include <iostream>
using namespace std;
#include "fstream"

int main()
{
        char fname[] = "d:/file1.txt";
        char buff[1024]= {0};
        /***********  寫檔案  *************/
        //方式1 輸出流ofstream物件呼叫fopen函式
        ofstream fout;
        fout.open(fname,ios::out);
        if(!fout)
        {
                cout<<"開啟檔案失敗"<<fname<<endl;
        }
        fout<< "hello world !";  //通過左移運算子寫入字串
        fout.flush();
        fout.close();
	 //方式2 呼叫輸出流ofstream物件的建構函式
        ofstream fout1(fname,ios::out);
        if(!fout1)
        {
                cout<<"開啟檔案失敗"<<fname<<endl;
        }
        fout1.put('h'); //通過put函式寫入字元
        fout1.put('e');
        fout1.put('l');
        fout1.put('l');
        fout1.put('o');
        fout1.put('\n');
        fout1.flush();
        fout1.close();

        //檔案流物件寫檔案
        fstream file2(fname,ios::in|ios::out);
        file2<<"abdfd\n";
        file2<<"11111\n";
        file2.flush();
        file2.close();
	
        /***********  讀檔案  *************/
        //輸入流ifstream物件讀取檔案內容
        ifstream fin;
        fin.open(fname,ios::in);
        fin.getline(buff,1024);                //通過getline函式讀取字串
        cout<<buff<<endl;        
        fin.close();
        
        //檔案流物件讀檔案內容
        fstream file1(fname,ios::in|ios::out);
        file1>>buff;        //通過右移運算子讀出字串
        file1.close();
        cout<<buff<<endl;


        system("pause");
        return 0;
}
複製程式碼
二進位制檔案操作

對二進位制檔案的讀寫主要用istream類的成員函式read和write來實現。這兩個成員函式的原型為

istream& read(char *buffer,int len);

ostream& write(const char * buffer,int len);
#include <iostream>
using namespace std;
#include <fstream>

class Teacher
{
public:
        Teacher()
        {

        }
        Teacher(int age,char name[20])
        {
                this->age = age;
                strcpy(this->name,name);
        }
        void prinfInfo()
        {
                cout<<"Teacher name:"<<this->name<<"   age:"<<this->age<<endl;
        }
private:
	 int age;
        char name[20];
};

int main()
{
        Teacher t1(31,"xiaoming");
        Teacher t2(32,"xiaohong");
        Teacher t3(33,"xiaohua");
        Teacher t4(34,"xiaoxin");
        char fname[] = "d:/file2";
        fstream fs(fname,ios::binary|ios::out);
        if(!fs)
        {
                cout<<"檔案開啟失敗"<<endl;
        }
        fs.write((char *)&t1,sizeof(Teacher));
        fs.write((char *)&t2,sizeof(Teacher));
        fs.write((char *)&t3,sizeof(Teacher));
        fs.write((char *)&t4,sizeof(Teacher));
        fs.flush();
        fs.close();

        fstream fs2(fname,ios::binary|ios::in);
        if(!fs)
	 {
                cout<<"檔案開啟失敗"<<endl;
        }
        Teacher tt;
        fs2.read((char *)&tt,sizeof(Teacher));
        tt.prinfInfo();
        fs2.read((char *)&tt,sizeof(Teacher));
        tt.prinfInfo();
        fs2.read((char *)&tt,sizeof(Teacher));
        tt.prinfInfo();
        fs2.read((char *)&tt,sizeof(Teacher));
        tt.prinfInfo();
        fs2.close();

        system("pause");
        return 0;
}
複製程式碼
輸出:
Teacher name:xiaoming   age:31
Teacher name:xiaohong   age:32
Teacher name:xiaohua   age:33
Teacher name:xiaoxin   age:34<span style="color: rgb(46, 46, 46); font-family: 'Microsoft YaHei', 宋體, 'Myriad Pro', Lato, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 15px; line-height: 24px; background-color: rgb(255, 255, 255);">eam& write(const char * buffer,int len);</span>
複製程式碼


轉載自:http://bbs.jointforce.com/topic/20397