c++學習筆記:文件流的各類操做

欲使用ifstream和ofstream,首先須要引用fstreamios

#include <fstream>

1、使用ifstream讀取文件的所有文本api

ifstream ifs;
   string path("src/test.txt");//考慮到最終程序最終執行環境是在工程目錄下的,因此這裏用此路徑
   ifs.open(path);//open能夠傳第二個參數,六個值in:以讀方式打開;out:以寫方式打開,直接寫入將覆蓋,可是能夠移動指針,在文件末尾寫入;binary:操做方式將更傾向於二進制;ate:打開時在打開狀態輸出默認會在文件的末尾(EOF),但未在打開狀態會清空該文件;app:輸出也是在文件末尾展開,不會清空該文件;trunc:任何打開前的內容,都將會被清空。
值得注意的是:若是該文件的上層目錄不存在的話,將確定會失敗,反之,則沒有該文件時候,會自動建立一個

string str;
string line; if(ifs){//隱式轉換爲bool while(getline(ifs,line)){ str +=line; } cout<<str<<endl; }else{ cout<<"真很差意思,打開失敗了"<<endl; }

 2、分先後兩段,讀取文件的所有文本app

ifstream ifs;
   string path("src/test.txt");
   ifs.open(path,ios::binary);
   if(ifs){
      ifs.seekg(0,ios::end);//指針指向流的末尾,相對於末尾的偏移量爲0,另外此方法還有傳入一個參數的重載版本,傳入的是一個相對於文件結束位置的絕對值
      int length = static_cast<int>(ifs.tellg());//tellg返回當前指針的位置,從0開始,end指向的恰好是文件結束位置的下一位,因此end的位置恰好是文件的字節數,因此若是是漢字,使用二進制一半一半讀取的話,中間一個漢字可能被拆分而成爲亂碼
      ifs.seekg(0,ios::beg);//能夠穿 end:流的末位的下一位,beg:流的開始位置和cur:當前讀取位置。
      int strLength1 = length/2;
      int strLength2 = length%2==0?strLength1:strLength1;
      char str1[strLength1+1];
      char str2[strLength2+1];
      ifs.read(str1,strLength1);
      ifs.read(str2,strLength2);
      ifs.close();
      cout<<str1<<endl<<endl<<endl<<endl<<str2;
   }else{
       cout<<"真很差意思,打開失敗了"<<endl;
   }

3、直接在文件末尾添加一段文字學習

       ofstream ofs;
       string path("src/test.txt");
       ofs.open(path,ios::app);//以append方式打開文件
       string text("三月,僞文學家發情的、無病呻吟的季節");
       ofs.write(text.c_str(),text.length());
       ofs.close();

4、複製文件的內容,用複製的內容替代之前的內容,其實至關於什麼都不幹spa

ifstream ifs;
    string path("src/test.txt");
    ifs.open(path,ios::in);
    char* data;
    int length = -1;
    if(ifs){
        ifs.seekg(0,ios::end);
        length = static_cast<int>(ifs.tellg());
        ifs.seekg(0,ios::beg);
        char str[length+1];
        data = str;
        ifs.read(str,length);
        ifs.close();
    }

    if(length!=-1){
        ofstream ofs;
            ofs.open(path,ios::ate|ios::out);//清空模式
           if(ofs){
                ofs.write(data,length);
                ofs.close();
                cout<<"寫入成功"<<endl;
            }
    }

此外,若是讀取一個文件以後,須要讀取下一個,直接調用clear方法就能夠接着幹了。指針

嗯,最經常使用的方法就學到這裏,其餘的遇到自行查閱api,下次開始學習sstreamcode

相關文章
相關標籤/搜索