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.