fstream的使用(二)

long pos = file.tellg();   // 獲得文件指針當前指向的文件位置(當指向文件末尾就是文件的長度)。ios

file.seekg(0,ios::beg);   // 讓文件指針定位到文件開頭windows

file.seekg(0,ios::end);   // 讓文件指針定位到文件末尾數組

file.seekg(10,ios::cur);   // 讓文件指針從當前位置向文件末方向移動10個字節app

file.seekg(-10,ios::cur);   // 讓文件指針從當前位置向文件開始方向移動10個字節編輯器

file.seekg(10,ios::beg);   // 讓文件指針定位到離文件開頭10個字節的位置函數

 

1、ASCII 輸出

首先聲明一個類對象:
ofstream fout;
打開一個文件,調用ofstream::open():
fout.open("output.txt");

也能夠把文件名做爲構造參數來打開一個文件:
ofstream fout("output.txt");

順便說一句, 若是你要打開的文件不存在,它會爲你建立一個, 因此不用擔憂文件建立的問題.

例子:
int num = 150;
char name[] = "John Doe";
fout << "Here is a number: " << num << "\n";
fout << "Now here is a string: " << name << "\n";

fout << flush; fout.close();

如今你用文本編輯器打開文件:
Here is a number: 150 Now here is a string: John Doe


2、ASCII 輸入

輸入和"cin" 流很像,
但你要考慮幾件事情,

先看一個文本:

12 GameDev 15.45 L
This is really awesome!

爲了打開這個文件,你必須建立一個in-stream對象:
ifstream fin("input.txt");

如今讀入前四行.
int number;
float real;
char letter, word[8];
fin >> number;
fin >> word;
fin >> real;
fin >> letter;

也能夠把這四行讀取文件的代碼寫爲更簡單的一行。
fin >> number >> word >> real >> letter;

文件的每一個空白以後, ">>" 操做符會中止讀取內容, 直到遇到另外一個>>操做符.
由於咱們讀取的每一行都被換行符分割開(是空白字符), ">>" 操做符只把這一行的內容讀入變量。這就是這個代碼也能正常工做的緣由。可是,可別忘了文件的最後一行。

This is really awesome!

若是你想把整行讀入一個char數組, 咱們沒辦法用">>"操做符,由於每一個單詞之間的空格(空白字符)會停止文件的讀取。

char sentence[101]; fin >> sentence;

咱們想包含整個句子, "This is really awesome!" 可是由於空白, 如今它只包含了"This".
很明顯, 確定有讀取整行的方法, 它就是getline()。這就是咱們要作的。

fin.getline(sentence, 100);

第一個參數顯然是用來接受的char數組. 第二個參數是在遇到換行符以前,數組容許接受的最大元素數量.


3、二進制 輸入輸出

注意咱們再也不使用插入和提取操做符(注:<< 和 >> 操做符).
你能夠這麼作,但它不會用二進制方式讀寫。你必須使用read() 和write() 方法讀取和寫入二進制文件. 建立一個二進制文件, 看下一行。

建立一個二進制文件,
ofstream fout("file.dat", ios::binary);
這會以二進制方式打開文件, 而不是默認的ASCII模式。

函數write() 有兩個參數。 第一個是指向對象的char類型的指針, 第二個是對象的大小(譯者注:字節數)。
int number = 30;
fout.write((char *)(&number), sizeof(number));

第一個參數寫作"(char *)(&number)". 這是把一個整型變量轉爲char *指針。
第二個參數寫做"sizeof(number)". sizeof() 返回對象大小的字節數. 就是這樣!

二進制文件最好的地方是能夠在一行把一個結構寫入文件。
若是說,你的結構有12個不一樣的成員。 用ASCII文件,你不得不每次一條的寫入全部成員。 但二進制文件替你作好了。

struct OBJECT
{ int number;
char letter;
} obj;
obj.number = 15;
obj.letter = ‘M’;
fout.write((char *)(&obj), sizeof(obj));

這樣就寫入了整個結構!

輸入也很簡單,由於read()函數的參數和 write()是徹底同樣的, 使用方法也相同。

ifstream fin("file.dat", ios::binary);
fin.read((char *)(&obj), sizeof(obj));

二進制文件比ASCII文件簡單, 但有個缺點是沒法用文本編輯器編輯。

-------------------
讀文件

方法get() 每次返回一個字符。

方法ignore(int,char) 跳過必定數量的某個字符, 但你必須傳給它兩個參數。
第一個是須要跳過的字符數。
第二個是一個字符, 當遇到的時候就會中止。 例子,

fin.ignore(100, ‘\n’);

會跳過100個字符,或者不足100的時候,跳過全部以前的字符,包括 ‘\n’。

寫文件

put(char), 它每次向輸出流中寫入一個字符。


打開文件

當咱們用這樣的語法打開二進制文件:

ofstream fout("file.dat", ios::binary);

"ios::binary"是你提供的打開選項的額外標誌. 默認的, 文件以ASCII方式打開, 不存在則建立, 存在就覆蓋. 這裏有些額外的標誌用來改變選項。

ios::app 添加到文件尾
ios::ate 把文件標誌放在末尾而非起始。
ios::trunc 默認. 截斷並覆寫文件。
ios::nocreate 文件不存在也不建立。
ios::noreplace 文件存在則失敗。

文件狀態

eof(), 它返回是否標誌已經到了文件末尾。

這個代碼斷統計小寫‘e’ 在文件中出現的次數。

ifstream fin("file.txt");
char ch;
int counter;
while (!fin.eof())
{
    ch = fin.get();
    if (ch == ‘e’) counter++;
}
fin.close();
 操作系統

ofstream類的默認構造函數以下:指針

 

ofstream::ofstream(const char* filename, int mode = ios::out, int openport = filebuf::openport);code

filename是要打開的文件名,
mode是打開的方式,
openport是打開文件的屬性。對象

mode能夠設置的方式以下:
ios::app         以追加的方式打開
ios::ate         文件打開後定位到文件尾
ios::binary     以二進制方式打開文件,默認是以文本方式打開
ios::in           文件以讀(輸入)方式打開
ios::out        文件以寫(輸出)方式打開
ios::trunc      若是文件存在,則把文件清空。
以上屬性用「|」(按位或)鏈接起來。

openprot屬性以下:
0     普通文件
1     只讀文件
2     隱含文件
4     系統文件
以上屬性能夠用加或者按位或方式組織起來,好比1|2和3都表明既是隻讀又是隱含文件。

在windows操做系統中能夠不要第三個參數,若是加入第三個參數,那第三個參數是打開文件的共享方式,也就是打開這個文件時,其餘進程是否能夠讀寫該文件。
共享方式參數能夠是下面的值:
0x10 //_SH_DENYRW Denies read and write access to the file
0x20 //_SH_DENYWR Denies write access to the file
0x30 //_SH_DENYRD Denies read access to the file.
0x40 //_SH_DENYNO Permits read and write access
其餘值都會報 "Invalid sharing flag "的錯誤。

ofstream hFile("c:\\1.txt", ios::out, _SH_DENYRW); // _SH_DENYRW is deny read and write     if (!hFile) // if the file could open, hFile is a handle, else is zero    {         cout << "write fail!" << endl;       cout << "access is denies,maybe the file is readonlys,or use deny read opened of other process." << endl;     }     else     {         hFile << "by coderlee writes";         cout << "write success!" << endl;     }     hFile.close(); // opened file need close.

相關文章
相關標籤/搜索