天天看點

c++檔案I/O

一、簡單的檔案輸入和輸出

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

int main()
{
    //讓程式寫入檔案
    //1、建立ofstream 對象
    //2、将該對象與對應的檔案關聯
    //3、輸出到檔案
    //4、關閉檔案

    string filename;
    cin>>filename;
    //c_str() 傳回一個指向字元串的指針
    //如果filename是c字元串格式,可以直接傳參數
    ofstream fout(filename.c_str());

    fout<<"This is c ++ io test !\n";

    fout.close();

    //讓程式從檔案讀取資料

    //1、建立一個ifstream對象管理輸入流
    //2、将該對象與對應的檔案綁定
    //3、以使用cin的方式,(注意:是方式,不是cin),使用該檔案
    //4、關閉檔案

    ifstream fin(filename.c_str());
    cout<<"Here are the content of "<<filename<<":\n";

    char ch;
    while(fin.get(ch))//從檔案讀取字元
        cout<<ch;//輸出到螢幕
    fin.close();
    return 0;
}
           

二、狀态檢查和is_opne()

較新的c++提供了 檢查檔案是否被打開的方法 is_open(),可以檢查出是否以不合适的檔案模式打開失敗

三、打開多個檔案

1、如果需要同時打開多個檔案,則必須為每一個檔案建立一個流。

2、如果需要同時打開一組檔案,可以隻打開一個流。首先建立ifstream對象,然後使用open()方法将流與這個檔案關聯起來

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main(int argc,char**argv)
{
    ifstream fin;
    char ch;
    int total = 0;
    for(int i = 0; i<argc; i++)
    {
        fin.open(argv[i]);
        if(!fin.is_open())
        {
            cerr<<"can't open the file"<<argv[i]<<endl;
            fin.clear();
            continue;
        }
        int temp = 0;
        while(fin.get(ch))
        {
            temp++;
        }
        cout<<total<<" characters in files "<<argv[i]<<endl;
        total += temp;
        fin.clear();
        fin.close();
    }
    cout<<"Total characters of the file are "<<total<<endl;

    return 0;
}
           
c++檔案I/O

四、檔案模式

檔案模式描述的是檔案将被如何使用:讀、寫、追加等。

在使用流與檔案關聯時,還是open函數,都可以指定檔案模式的第二個參數

ios_base類定義了openmode類型,用于表示模式

常量 含義
ios_base::in 打開檔案,便于讀取
ios_base::out 打開檔案,以便寫入
ios_base::ate 打開檔案,并移到檔案尾
ios_base::app 追加到檔案尾
ios_base::trunc 如果檔案存在,則截短檔案,即把檔案内容長度截短為0,相當于删除檔案已有的内容
ios_base::binary 二進制檔案

五、追加檔案,即在一個檔案的末尾追加資料

#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
using namespace std;
void AddToFile(string filename)
{
    //首先顯示已有内容
    char ch;
    ifstream fin;
    fin.open(filename);
    if(fin.is_open())
    {
        while(fin.get(ch))
            cout<<ch;
        fin.close();
    }
    //然後追加文檔
    ofstream fout(filename,ios::out | ios::app);

    if(!fout.is_open())
    {
        cout<<"Can't open file !"<<endl;
        exit(EXIT_FAILURE);
    }
    string content;
    while(getline(cin,content) && content.size()>0)
    {
        fout<<content<<endl;
    }
    fout.close();


}
int main()
{
    const char* filename = "test.txt";
    AddToFile(filename);
    return 0;
}
           
c++檔案I/O
c++檔案I/O

六、什麼是二進制檔案,什麼是文本檔案

  • 文本檔案格式是指将所有的内容甚至是數字都存儲為文本
  • 二進制格式指的是存儲值的計算機内部表示。也就是說,計算機不是存儲字元,而是存儲這個值的64位double表示
  • 對于字元來說,二進制表示與文本表示是一樣的,即都是字元的ASCII碼的二進制表示,對于數字來說,二進制表示與文本表示有很大的差别

七、兩種模式的對比

  • 文本模式便于讀取
  • 二進制檔案對于數字來說比較精确,因為它存儲的是值的内部表示,是以不會有轉換誤差和舍入誤差
  • 二進制格式儲存資料的速度更快,并可以大塊的存儲資料,占用的空間也比較小
  • 不同平台的二進制存儲方式有所不同,即有可能在一個系統上的二進制檔案在另一個平台上打不開

八、使用二進制存儲資料時,可以使用成員函數 write