C++文件操作(2)

打開文件的方式

      當我們想要打開的文件不存在的時候,一般地,ofstream類的對象會默認地自動創建一個文件。而如果我們想要打開的文件是存在的,那麼就會調用ofstream的構造函數或者是調用open()函數進行打開。下面,我們來看一下MSDN上面是如何定義open()函數的:

首先是函數原型:

void open(
    const char *_Filename,
    ios_base::openmode _Mode = ios_base::in | ios_base::out,
    int _Prot = (int)ios_base::_Openprot
);
void open(
    const char *_Filename,
    ios_base::openmode _Mode
);
void open(
    const wchar_t *_Filename,
    ios_base::openmode _Mode = ios_base::in | ios_base::out,
    int _Prot = (int)ios_base::_Openprot
);
void open(
    const wchar_t *_Filename,
    ios_base::openmode _Mode
);

接下來是參數的說明:

_Filename
The name of the file to open.
打開文件名

_Mode
One of the enumerations in ios_base::openmode.
文件的打開方式(在ios_base::openmode中定義)

_Prot
The default file opening protection.
默認進行文件打開時的保護

OK,我們再來看看ios_base::openmode中定義的打開方式:OK,我們再來看看ios_base::openmode中定義的打開方式:
ios::in, to permit extraction from a stream.
打開文件進行讀操作,即讀取文件中的數據

ios::out, to permit insertion to a stream.
打開文件進行寫操作,即輸出數據到文件中

ios::app, to seek to the end of a stream before each insertion.
打開文件之後文件指針指向文件末尾,只能在文件末尾進行數據的寫入

ios::ate, to seek to the end of a stream when its controlling object is first created.
打開文件之後文件指針指向文件末尾,但是可以在文件的任何地方進行數據的寫入

ios::trunc, to delete contents of an existing file when its controlling object is created.
默認的文件打開方式,若文件已經存在,則清空文件的內容

ios::binary, to read a file as a binary stream, rather than as a text stream.
打開文件爲二進制文件,否則爲文本文件

      好了,open()函數的用法全部列舉出來了。下面就針對ios_base::binary的二進制打開方式,我們在來談一談二進制文件的輸出方式和文本文件的輸出方式。

      ① 文本形式輸出到文件,我們完全可以在open函數的mode選項中調用

 
ios::out|ios::app


 

  好了,上面這句話說的就是將數據依次輸出。注意,這裏用的是依次,原因就是我們採用了app(append)模式,此表示在文件末尾繼續寫入文件,這就實現了數據的挨個寫入 ^_^。一個完整的程序例子如下:

 
#include <iostream>

#include<fstream>

usingnamespace std;

constint num=20;

structpeople

{

    charname[num];

    doubleweight;

    inttall;

    intage;

    charsex;

};

int main()

{

    people pe={"李勇",78.5,181,25,'f'};

    ofstream fout("people.txt",ios::out|ios::app);

    fout<<pe.name<<" "<<pe.age<<" "<<pe.sex<<" "<<pe.tall<<" "<<pe.weight<<" "<<"\n";

    fout.close();

    ifstream fin("people.txt");

    charch[255];

    fin.getline(ch,255-1,0);

    cout<<ch;

    fin.close();

    return0;

}

 輸出如下:

      我們可以看到,people.txt文件中的內容和命令行中的一樣。

      ② 二進制形式輸出到文件 爲了能夠讓其用二進制方式輸出文件,我們只需要把上面程序的第16行和17行換做

 
ofstream fout("people.txt",ios::binary);

fout.write((char*)&pe,sizeofpe);

 程序的第1行中的標誌binary用於開啓二進制模式,第2行調用了write函數。該函數有兩個參數,第一個是要寫入數據的首地址,在這裏是結構體pe的地址,而第二個參數是要寫入的字符數目,這裏我們用sizeof來計算pe的字符數。具體程序如下:
 
#include <iostream>

#include<fstream>

usingnamespace std;

constint num=20;

structpeople

{

    charname[num];

    doubleweight;

    inttall;

    intage;

    charsex;

};

int main()

{

    people pe={"李勇",78.5,181,25,'f'};

    ofstream fout("people.txt",ios::binary);

    fout.write((char*)&pe,sizeofpe);

    fout.close();

    people pe1={"張玲",65.4,165,62,'m'};

    ifstream fin("people.txt",ios::binary);

    fin.read((char*)&pe1,sizeofpe1);

    cout<<pe1.name<<" "<<pe1.age<<" "<<pe1.sex<<" "<<pe1.tall<<" "

        << pe1.weight <<" "<<"\n";

    fin.close();

    return0;

}

   我們再來看看這個東東的輸出,我們可以看到,以txt文檔打開文件時候,會產生亂碼。這就是因爲txt文件是以文本方式打開的,所以我們看到的都是亂碼。如下圖:

呼呼,以上就是我自認的自己不是很懂的C++關於如何操作文件的記錄,到這裏了~~全文完 ^_^

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章