c++那些事兒7.0 I/O流,文件操作

知識點綜述:


C++  I/O:
     在iostream頭文件中定義
        istream    //通用輸入流和其它輸入流基類。
        ostream    //通用輸出流和其它流基類。
        iostream   //通用輸入輸出流和其它輸入輸出流基類。
        在fstream頭文件中定義
        ofstream     //文件寫操作 內存寫入存儲設備   
        ifstream     //文件讀操作,存儲設備讀區到內存中  
        fstream     //讀寫操作,對打開的文件可進行讀寫操作 
        在strstream頭文件中定義
        istrstream  //輸入字符串流
        ostrstream  //輸出字符串流
        strstream   //輸入輸出字符串流
cin,cout:
   cin,是istream的派生類的對象,是標準輸入流。
   cout,是ostream的派生類的對象,是標準輸出流。

操作步驟:
        (1)建立文件流對象;
        (2)打開或建立文件;
        (3)進行讀寫操作;
        (4)關閉文件;
格式控制輸出:
     dec 10進制輸出,   hex  16進制輸出    oct 8進制輸出.
     setfill(c)設置填充字符c ,  setprecision(n)設置實數的精度的n位。
     setw(n)設置字段寬度n 
     setiosflags(ios::fixed)設置浮點數以固定的小數位顯示
     setiosflags(ios::left)輸出數據左對齊,   setiosflags(ios::right)輸出數據右對齊
ios類中:
    void open(const char* filename,ios_base::openmode mode);
mode打開文件的方式
  ios::binary: 以二進制方式打開文件,缺省的方式是文本方式
   ios::in: 文件以輸入方式打開(文件數據輸入到內存)(ifstream對象默認方式就是這個)
   ios::out: 文件以輸出方式打開(內存數據輸出到文件)(ofstream對象默認的打開方式

常識:
 文本文件和二進制文件
 文本文件:由字符序列組成,以字符(character) 為存取最小信息單位,也稱“ASCII碼文件”。
 二進制文件:由二進制數組成。

 相關的函數:
    void open( const char *filename );  
             //函數open()用于文件流。它打開filename 并將其與當前的流相關聯。
    void close(); 
           //函數關閉相關的文件流。   
    ostream &flush();  
           //flush()函數可以引起當把前流的緩沖區寫出到附屬設備中去。
    int get();   
         //讀入一個字符并返回它的值,重載函數特別多。
    ostream &put( char ch );  
        //函數put()用于輸出流,并把字符ch寫入流中。
    istream &get( char &ch );  
       //讀入一個字符并把它存儲在ch, 
    istream &getline( char *buffer, streamsize num );  
       //getline()函數用于輸入流,讀取字符到buffer中,
    istream &read( char *buffer, streamsize num ); 
           //函數read()用于輸入流,在將字符放入buffer 之前從流中讀取num 個字節。
如果碰到EOF,
     read()中止ostream &write( const char *buffer, streamsize num );

        //write()函數用于輸出流,從buffer中寫num個字節到當前輸出流中。



看一張I/O相關類的圖
c++流的關系圖.jpg



常見對象的解釋

c++ I-O.PNG


看代碼

#include<iostream>
#include<string>
#include<fstream>
#include<iomanip>
void  display();
void writeFile();
void readFile();
void readBinaryFile();
void copyFile();
using namespace std;
int main() {
    display();   //格式控制符的運用。
    writeFile();
    readFile();
    readBinaryFile();
    copyFile();
    system("pause");
    return 0;
}

void  display() {
    int a = 123;
    float b = 1.2345f;
    double c = 1.23456;
    string d = "dflx";

    cout << "dec:" << dec << a << endl;
    cout << "hex:" << hex << a << endl;
    cout << "oct:" << oct << a << endl;
    cout << setw(5) << d << endl;
    cout << setfill('*') << setw(5) << d << endl;
    cout << setw(5) << setiosflags(ios::right) << a << endl;
    cout << setw(5) << setiosflags(ios::left) << a << endl;
    cout << setiosflags(ios::scientific) << setprecision(8);
    cout << "c=" << c << endl;
    cout << "c=" << setprecision(5) << c << endl;
    cout << "------------------"<<endl;
    cout.put('a') << endl;
    putchar('b');
    cout << endl;
    cout << "enter a sentence:";
    int ch;
    while ((ch = cin.get()) != '#')
        cout.put(ch);
    cout <<endl<< "--------------------格式控制結束------------------------" << endl;
}

//文本方式寫
void writeFile() {
    
    /*
      ofstream outfile; 建立ifstream對象
      outfile.open("D:\\workspace_java\\File\\g.txt");  將對象與文件關聯
      等價面的。
    */
    cout << "-----------寫文本文件------------" << endl;
    ofstream outfile("D:\\workspace_java\\File\\g.txt", ios::out);
    if (!outfile) {
        cerr << "open error" << endl;
        exit(1);
       }
    string  str= "hello c plus plus \n";
    outfile << str;  //使用該對象將數據輸出到文件
    outfile.close();

}
//文本方式讀
void readFile() {
    cout << "-----------讀文本文件------------" << endl;
    ifstream ifs;
    ifs.open("D:\\workspace_java\\File\\g.txt");
    char str[255];  //定義一個字符數組
         //ifs >> str; //將文件中的數據讀到str中。但是c++插入操作符遇到空字符變停止輸出。
    ifs.getline(str,255);
    cout << str << endl;
    cout << "------------------" << endl;
    /*如果我們想要在命令行中寫一段話,而且這段換中包含了空格和回車,
    那么我們就應該利用上面getline()函數的第三個參數,*/
    ifstream file("D:\\workspace_java\\File\\a.txt");
    if (!file) {
        cerr << "文件打開失敗" << endl;
    }
    char str1[1024];
    file.getline(str1, 255, 0);
    cout << str1 << endl;

}

/*
對于二進制文件的讀寫,我們必須強調的一點就是打開文件屬性必須添加:ios::binary,
其實就是告訴系統,我要按照二進制格式進行讀寫文件了。
*/
//二進制文件讀
void readBinaryFile() {
    cout << "-----------讀二進制文件------------" << endl;
    ifstream file;
    file.open("D:\\workspace_java\\File\\g.txt",::ios::binary);
    if (!file) {
        cerr << "文件打開失敗" << endl;
    }
    char str[1024] = { 0 };
    file.read(str, sizeof(char) * 1024);
    cout << str << endl;
    file.close();

}
/*
記住,write有兩個參數,第一個為字符數組參數,第二個需要輸入到文件的數據的
大小
舉列子:
   ofstream fout("text.bat", ios::binary);關聯時候。
   string str = "Hello word";
   fout.write(str.c_str(),sizeof(char)*(str.size()));
*/

//文件復制
void copyFile() {
    ifstream copy_file("D:\\workspace_java\\File\\春雨.txt");
    ofstream  new_file("D:\\workspace_java\\File\\我的春雨.txt");
    if (!copy_file || !copy_file) {
        cerr << "文件打開失敗" << endl;
        return;
    }

    while (!copy_file.eof()) {
        char buf[1024];
        copy_file.read(buf, sizeof(char) * 1024);
        new_file.write(buf, sizeof(char) * 1024);
    }
    cout << "文件復制成功" << endl;
}



結果如下

結果.PNG


重要知識點總結:

總結 幾個重要的東西:
     文件操作的流程
        (1)建立文件流對象; 
                   ofstream     //文件寫操作 內存寫入存儲設備   
                   ifstream     //文件讀操作,存儲設備讀區到內存中  
        (2)打開或建立文件;
                  void open(const char* filename,ios_base::openmode mode);
            mode打開文件的方式:
 ios::binary: 以二進制方式打開文件,缺省的方式是文本
 ios::in:    文件以輸入方式打開(文件數據輸入到內存)(ifstream對象默認方式就是這個)
 ios::out:   文件以輸出方式打開(內存數據輸出到文件)(ofstream對象默認的打開方式
        (3)進行讀寫操作;
                   istream &getline( char *buffer, streamsize num );
                   istream &read( char *buffer, streamsize num );
             //函數read()用于輸入流,在將字符放入buffer 之前從流中讀取num 個字節。
如果碰到EOF,read()中止
                   ostream &write( const char *buffer, streamsize num );
                   //write()函數用于輸出流,從buffer中寫num個字節到當前輸出流中。
        (4)關閉文件;
            close();

 文件復制中:
          bool eof();
             //如果到達相關聯的輸入文件的末尾,eof()函數返回true,否則返回false。 


c++ 的 I/O不會比java差,只是各自實現的方式不一樣。


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 背景 一年多以前我在知乎上答了有關LeetCode的問題, 分享了一些自己做題目的經驗。 張土汪:刷leetcod...
    土汪閱讀 12,771評論 0 33
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,301評論 25 708
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,765評論 18 399
  • 一大早,就和主任吵了一架,是不是太任性了呀,吼吼···明明現實存在的問題,為什么偏偏說不可能,是你的眼睛聾了,耳朵...
    小絲雨閱讀 127評論 0 1
  • http://www.veryhuo.com/a/view/98081.html Charles抓包charles...
    janezhang閱讀 357評論 0 0