C++中的文件输入/输出(6):一些有用的函数
生活随笔
收集整理的這篇文章主要介紹了
C++中的文件输入/输出(6):一些有用的函数
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
tellg() ——返回一個(gè)
int型數(shù)值,它表示“內(nèi)置指針”的當(dāng)前位置。此函數(shù)僅當(dāng)你在讀取一個(gè)文件時(shí)有效。例如:
#include <fstream.h>
??? ?
??? void main()
??? {
??? ??? // 假如我們已經(jīng)在 test_file.txt 中存有了“ Hello ”的內(nèi)容
??? ??? ifstream File("test_file.txt");
??? ?
??? ??? char arr[10];
??? ?
??? ??? File.read(arr,10);
??? ???
??? ??? // 由于 Hello 占 5 個(gè)字符,因此這里將返回 5
??? ??? cout << File.tellg() << endl;
??? ?
??? ??? File.close();
??? }
???
??? tellp() —— 與 tellg()有同樣的功能,但它用于寫(xiě)文件時(shí)。總而言之:當(dāng)我們讀取一個(gè)文件,并要知道內(nèi)置指針的當(dāng)前位置時(shí),應(yīng)該使用 tellg();當(dāng)我們寫(xiě)入一個(gè)文件,并要知道內(nèi)置指針的當(dāng)前位置時(shí),應(yīng)該使用 tellp(). 由于此函數(shù)的用法與 tellg()完全一樣,我就不給出示例代碼了。
??? seekp() —— 還記得 seekg()么?當(dāng)我在讀取一個(gè)文件,并想到達(dá)文件中某個(gè)特定位置時(shí),就曾使用過(guò)它。 seekp()亦如此,只不過(guò)它用于寫(xiě)入一個(gè)文件的時(shí)候。例如,假如我在進(jìn)行文件讀寫(xiě),而要定位到當(dāng)前位置的三個(gè)字符之前,則需調(diào)用 FileHandle.seekg(-3). 但如果我是在寫(xiě)入一個(gè)文件,并且比如我要重寫(xiě)后5個(gè)字符的內(nèi)容,我就必須往回跳轉(zhuǎn)5個(gè)字符,因而,我應(yīng)該使用 FileHandle.seekp(-5) .
??? ignore() —— 使用于讀取文件之時(shí)。如果你想略過(guò)一定數(shù)量的字符,只需使用此函數(shù)。實(shí)際上,你也可以使用 seekg()來(lái)代替,然而使用 ignore()有一個(gè)優(yōu)點(diǎn)——你可以指定一個(gè)特定“界限規(guī)則(delimiter rule)”,同樣使得 ignore()在指定的位置停下。函數(shù)原型如下:
??? istream& ignore( int nCount, delimiter );
???
??? nCount表示要略過(guò)的字符數(shù)量,而 delimiter —— 與它的名稱有著同樣的含義:假如你想在文件末尾停下,則可使用EOF值傳入,這樣一來(lái)此函數(shù)就等同于 seekg();但該參數(shù)還可以使用其他值,例如 ‘/n’這樣可以在換行的同時(shí)定位在新行處。下面是示例:
#include <fstream.h>
??? ?
??? void main()
??? {
??? ??? // 假設(shè) test_file.txt 中已經(jīng)存有 "Hello World" 這一內(nèi)容
??? ??? ifstream File("test_file.txt");
??? ?
??? ??? static char arr[10];
??? ?
??? ??? // 假如一直沒(méi)有遇到字符 "l" ,則向前定位直到跳過(guò) 6 個(gè)字符
??? ??? // 而如果期間遇到 "l" ,則停止向前,定位在該處
??? ??? File.ignore(6,'l');
??? ?
??? ??? File.read(arr,10);
??? ?
??? ??? cout << arr << endl; // 它將顯示 "lo World!"
??? ?
??? ??? File.close();
??? ?
??? }
???
getline() —— 雖然前面的章節(jié)中我曾提到過(guò)這個(gè)函數(shù),但還有一些內(nèi)容我們未曾涉及:此函數(shù)不但可用于逐行讀取,而且它還可以設(shè)為遇到某個(gè)特定字符后停止讀取。下面給出傳遞這一參數(shù)的方法:
??? getline(array,array_size,delim);
???
??? 以下為示例代碼:
??? #include <fstream.h>
??? ?
??? void main()
??? {
??? ??? // 假設(shè) test_file.txt 中已經(jīng)存有 "Hello World" 這一內(nèi)容
??? ??? ifstream File("test_file.txt");
??? ?
??? ??? static char arr[10];
??? ?
??? ??? /* 讀取,直到滿足下面的條件之一:
??? 1 )已經(jīng)讀取 10 個(gè)字符
??? 2 )遇到字母 "o"
??? 3 )出現(xiàn)新一行
??? ??? */
??? ??? File.getline(arr,10,'o');
??? ?
??? ??? cout << arr << endl; // 將顯示 "Hell"
??? ??? File.close();
??? }
???
peek() —— 此函數(shù)將返回輸入流文件的下一個(gè)字符,但它不移動(dòng)內(nèi)置指針。我想你該記得,像 get()這樣的函數(shù)也返回輸入流文件的下一個(gè)字符,而與此同時(shí)它將移動(dòng)內(nèi)置指針。所以當(dāng)你再次調(diào)用 get()函數(shù)的時(shí)候,它會(huì)返回再下一個(gè)字符,而非前面那個(gè)。哦,使用 peek()也會(huì)返回字符,但它不會(huì)移動(dòng)“光標(biāo)”。所以,假如你連續(xù)兩次調(diào)用 peek()函數(shù),它會(huì)返回同一個(gè)字符??紤]以下代碼:
??? #include <fstream.h>
??? ?
??? void main()
??? {
??? ??? // 假設(shè) test_file.txt 中已經(jīng)存有 "Hello World" 這一內(nèi)容
??? ??? ifstream File("test_file.txt");
??? ?
??? ??? char ch;
??? ?
??? ??? File.get(ch);
??? ??? cout << ch << endl; // 將顯示 "H"
??? ?
??? ??? cout <<??? char(File.peek()) << endl; // 將顯示 "e"
??? ??? cout <<??? char(File.peek()) << endl; // 將再次顯示 "e"
??? ?
??? ??? File.get(ch);
??? ??? cout << ch << endl; // 還是顯示 "e"
???
??? File.close();
??? ???
??? }
???
順便說(shuō)一下,我忘了講—— peek()函數(shù)實(shí)質(zhì)上返回的是字符的ASCII碼,而非字符本身。因此,假如你想看到字符本身,你得像我在示例中做的那樣進(jìn)行調(diào)用 (譯注:即要轉(zhuǎn)為 char 類型)。
??? _unlink() —— 刪除一個(gè)文件。假如你要使用此函數(shù),需要在你的程序中包含 io.h頭文件。下面是示例代碼:
??? #include <fstream.h>
??? #include <io.h>
??? ?
??? void main()
??? {
??? ??? ofstream File;
??? ?
??? ??? File.open("delete_test.txt"); // 創(chuàng)建一個(gè)文件
??? ??? File.close();
??? ?
??? ??? _unlink("delete_test.txt"); // 刪除這個(gè)文件
??? ?
??? ??? // 試圖打開(kāi)此文件,但假如它已不存在
??? ??? // 函數(shù)將返回一個(gè) ios::failbit 錯(cuò)誤值
??? ??? File.open("delete_test.txt",ios::nocreate);
??? ?
??? ??? // 驗(yàn)證它是否返回該值
??? ??? if(File.rdstate() == ios::failbit)
??? ??? ??? cout << "Error...!/n"; // 耶,成功了
???
??? File.close();
??? ?
??? }
???
putback() —— 此函數(shù)將返回最后一個(gè)所讀取字符,同時(shí)將內(nèi)置指針移動(dòng)-1個(gè)字符。換言之,如果你使用 get()來(lái)讀取一個(gè)字符后再使用 putback(),它將為你返回同一個(gè)字符,然而同時(shí)會(huì)將內(nèi)置指針移動(dòng)-1個(gè)字符,所以你再次使用 get()時(shí),它還是會(huì)為你返回同樣的字符。下面是示例代碼:
??? #include <fstream.h>
??? ?
??? void main()
??? {
??? ??? // test_file.txt 應(yīng)包含內(nèi)容 "Hello World"
??? ??? ifstream File("test_file.txt");
??? ???
??? ??? char ch;
??? ?
??? ??? File.get(ch);
??? ?
??? ??? cout << ch << endl; // 將顯示 "H"
??? ?
??? ??? File.putback(ch);
??? ??? cout << ch << endl; // 仍將顯示 "H"
??? ???
??? ??? File.get(ch);
??? ??? cout << ch << endl; // 再一次顯示 "H"
??? ?
??? ??? File.close();
??? }
???
??? flush() —— 在處理輸出流文件的時(shí)候,你所存入的數(shù)據(jù)實(shí)際上并非立刻寫(xiě)入文件,而是先放入一個(gè)緩沖區(qū)中,直到該緩沖區(qū)放滿數(shù)據(jù)之后,這些數(shù)據(jù)才被存入真正的文件中(在你的磁盤上)。旋即緩沖區(qū)會(huì)被清空,再重新進(jìn)行下一輪寫(xiě)入。
但假如你想在緩沖區(qū)寫(xiě)滿之前就將其中的數(shù)據(jù)寫(xiě)入磁盤,則使用 flush()函數(shù)。只須像這樣進(jìn)行調(diào)用: FileHandle.flush(),這樣緩沖區(qū)內(nèi)的數(shù)據(jù)將會(huì)寫(xiě)入實(shí)際的物理文件,而后緩沖區(qū)被清空。
再補(bǔ)充一點(diǎn)(高階的)內(nèi)容: flush()函數(shù)會(huì)調(diào)用與相應(yīng)流緩沖( streambuf)相聯(lián)系的 sync()函數(shù)(出自MSDN)。
??? 結(jié)語(yǔ)
???
嗯,我希望你現(xiàn)在可以實(shí)現(xiàn)你的文件輸入/輸出程序了。我已經(jīng)將自己所知的內(nèi)容都涉及到,我想它們比你所需要的還要多。即使如此,還是會(huì)有一些內(nèi)容我沒(méi)有提及的……不過(guò)我想你或許都不會(huì)使用到那些方面的內(nèi)容。因此,如果你還需要了解更多關(guān)于某些特定主題的高階的理論,可以在互聯(lián)網(wǎng)上搜索,例如,可以嘗試一下 google.com,但你可別來(lái)問(wèn)我!我不對(duì)任何詢問(wèn)我關(guān)于如何實(shí)現(xiàn)某個(gè)程序此類問(wèn)題的郵件作答復(fù)。
#include <fstream.h>
??? ?
??? void main()
??? {
??? ??? // 假如我們已經(jīng)在 test_file.txt 中存有了“ Hello ”的內(nèi)容
??? ??? ifstream File("test_file.txt");
??? ?
??? ??? char arr[10];
??? ?
??? ??? File.read(arr,10);
??? ???
??? ??? // 由于 Hello 占 5 個(gè)字符,因此這里將返回 5
??? ??? cout << File.tellg() << endl;
??? ?
??? ??? File.close();
??? }
???
??? tellp() —— 與 tellg()有同樣的功能,但它用于寫(xiě)文件時(shí)。總而言之:當(dāng)我們讀取一個(gè)文件,并要知道內(nèi)置指針的當(dāng)前位置時(shí),應(yīng)該使用 tellg();當(dāng)我們寫(xiě)入一個(gè)文件,并要知道內(nèi)置指針的當(dāng)前位置時(shí),應(yīng)該使用 tellp(). 由于此函數(shù)的用法與 tellg()完全一樣,我就不給出示例代碼了。
??? seekp() —— 還記得 seekg()么?當(dāng)我在讀取一個(gè)文件,并想到達(dá)文件中某個(gè)特定位置時(shí),就曾使用過(guò)它。 seekp()亦如此,只不過(guò)它用于寫(xiě)入一個(gè)文件的時(shí)候。例如,假如我在進(jìn)行文件讀寫(xiě),而要定位到當(dāng)前位置的三個(gè)字符之前,則需調(diào)用 FileHandle.seekg(-3). 但如果我是在寫(xiě)入一個(gè)文件,并且比如我要重寫(xiě)后5個(gè)字符的內(nèi)容,我就必須往回跳轉(zhuǎn)5個(gè)字符,因而,我應(yīng)該使用 FileHandle.seekp(-5) .
??? ignore() —— 使用于讀取文件之時(shí)。如果你想略過(guò)一定數(shù)量的字符,只需使用此函數(shù)。實(shí)際上,你也可以使用 seekg()來(lái)代替,然而使用 ignore()有一個(gè)優(yōu)點(diǎn)——你可以指定一個(gè)特定“界限規(guī)則(delimiter rule)”,同樣使得 ignore()在指定的位置停下。函數(shù)原型如下:
??? istream& ignore( int nCount, delimiter );
???
??? nCount表示要略過(guò)的字符數(shù)量,而 delimiter —— 與它的名稱有著同樣的含義:假如你想在文件末尾停下,則可使用EOF值傳入,這樣一來(lái)此函數(shù)就等同于 seekg();但該參數(shù)還可以使用其他值,例如 ‘/n’這樣可以在換行的同時(shí)定位在新行處。下面是示例:
#include <fstream.h>
??? ?
??? void main()
??? {
??? ??? // 假設(shè) test_file.txt 中已經(jīng)存有 "Hello World" 這一內(nèi)容
??? ??? ifstream File("test_file.txt");
??? ?
??? ??? static char arr[10];
??? ?
??? ??? // 假如一直沒(méi)有遇到字符 "l" ,則向前定位直到跳過(guò) 6 個(gè)字符
??? ??? // 而如果期間遇到 "l" ,則停止向前,定位在該處
??? ??? File.ignore(6,'l');
??? ?
??? ??? File.read(arr,10);
??? ?
??? ??? cout << arr << endl; // 它將顯示 "lo World!"
??? ?
??? ??? File.close();
??? ?
??? }
???
getline() —— 雖然前面的章節(jié)中我曾提到過(guò)這個(gè)函數(shù),但還有一些內(nèi)容我們未曾涉及:此函數(shù)不但可用于逐行讀取,而且它還可以設(shè)為遇到某個(gè)特定字符后停止讀取。下面給出傳遞這一參數(shù)的方法:
??? getline(array,array_size,delim);
???
??? 以下為示例代碼:
??? #include <fstream.h>
??? ?
??? void main()
??? {
??? ??? // 假設(shè) test_file.txt 中已經(jīng)存有 "Hello World" 這一內(nèi)容
??? ??? ifstream File("test_file.txt");
??? ?
??? ??? static char arr[10];
??? ?
??? ??? /* 讀取,直到滿足下面的條件之一:
??? 1 )已經(jīng)讀取 10 個(gè)字符
??? 2 )遇到字母 "o"
??? 3 )出現(xiàn)新一行
??? ??? */
??? ??? File.getline(arr,10,'o');
??? ?
??? ??? cout << arr << endl; // 將顯示 "Hell"
??? ??? File.close();
??? }
???
peek() —— 此函數(shù)將返回輸入流文件的下一個(gè)字符,但它不移動(dòng)內(nèi)置指針。我想你該記得,像 get()這樣的函數(shù)也返回輸入流文件的下一個(gè)字符,而與此同時(shí)它將移動(dòng)內(nèi)置指針。所以當(dāng)你再次調(diào)用 get()函數(shù)的時(shí)候,它會(huì)返回再下一個(gè)字符,而非前面那個(gè)。哦,使用 peek()也會(huì)返回字符,但它不會(huì)移動(dòng)“光標(biāo)”。所以,假如你連續(xù)兩次調(diào)用 peek()函數(shù),它會(huì)返回同一個(gè)字符??紤]以下代碼:
??? #include <fstream.h>
??? ?
??? void main()
??? {
??? ??? // 假設(shè) test_file.txt 中已經(jīng)存有 "Hello World" 這一內(nèi)容
??? ??? ifstream File("test_file.txt");
??? ?
??? ??? char ch;
??? ?
??? ??? File.get(ch);
??? ??? cout << ch << endl; // 將顯示 "H"
??? ?
??? ??? cout <<??? char(File.peek()) << endl; // 將顯示 "e"
??? ??? cout <<??? char(File.peek()) << endl; // 將再次顯示 "e"
??? ?
??? ??? File.get(ch);
??? ??? cout << ch << endl; // 還是顯示 "e"
???
??? File.close();
??? ???
??? }
???
順便說(shuō)一下,我忘了講—— peek()函數(shù)實(shí)質(zhì)上返回的是字符的ASCII碼,而非字符本身。因此,假如你想看到字符本身,你得像我在示例中做的那樣進(jìn)行調(diào)用 (譯注:即要轉(zhuǎn)為 char 類型)。
??? _unlink() —— 刪除一個(gè)文件。假如你要使用此函數(shù),需要在你的程序中包含 io.h頭文件。下面是示例代碼:
??? #include <fstream.h>
??? #include <io.h>
??? ?
??? void main()
??? {
??? ??? ofstream File;
??? ?
??? ??? File.open("delete_test.txt"); // 創(chuàng)建一個(gè)文件
??? ??? File.close();
??? ?
??? ??? _unlink("delete_test.txt"); // 刪除這個(gè)文件
??? ?
??? ??? // 試圖打開(kāi)此文件,但假如它已不存在
??? ??? // 函數(shù)將返回一個(gè) ios::failbit 錯(cuò)誤值
??? ??? File.open("delete_test.txt",ios::nocreate);
??? ?
??? ??? // 驗(yàn)證它是否返回該值
??? ??? if(File.rdstate() == ios::failbit)
??? ??? ??? cout << "Error...!/n"; // 耶,成功了
???
??? File.close();
??? ?
??? }
???
putback() —— 此函數(shù)將返回最后一個(gè)所讀取字符,同時(shí)將內(nèi)置指針移動(dòng)-1個(gè)字符。換言之,如果你使用 get()來(lái)讀取一個(gè)字符后再使用 putback(),它將為你返回同一個(gè)字符,然而同時(shí)會(huì)將內(nèi)置指針移動(dòng)-1個(gè)字符,所以你再次使用 get()時(shí),它還是會(huì)為你返回同樣的字符。下面是示例代碼:
??? #include <fstream.h>
??? ?
??? void main()
??? {
??? ??? // test_file.txt 應(yīng)包含內(nèi)容 "Hello World"
??? ??? ifstream File("test_file.txt");
??? ???
??? ??? char ch;
??? ?
??? ??? File.get(ch);
??? ?
??? ??? cout << ch << endl; // 將顯示 "H"
??? ?
??? ??? File.putback(ch);
??? ??? cout << ch << endl; // 仍將顯示 "H"
??? ???
??? ??? File.get(ch);
??? ??? cout << ch << endl; // 再一次顯示 "H"
??? ?
??? ??? File.close();
??? }
???
??? flush() —— 在處理輸出流文件的時(shí)候,你所存入的數(shù)據(jù)實(shí)際上并非立刻寫(xiě)入文件,而是先放入一個(gè)緩沖區(qū)中,直到該緩沖區(qū)放滿數(shù)據(jù)之后,這些數(shù)據(jù)才被存入真正的文件中(在你的磁盤上)。旋即緩沖區(qū)會(huì)被清空,再重新進(jìn)行下一輪寫(xiě)入。
但假如你想在緩沖區(qū)寫(xiě)滿之前就將其中的數(shù)據(jù)寫(xiě)入磁盤,則使用 flush()函數(shù)。只須像這樣進(jìn)行調(diào)用: FileHandle.flush(),這樣緩沖區(qū)內(nèi)的數(shù)據(jù)將會(huì)寫(xiě)入實(shí)際的物理文件,而后緩沖區(qū)被清空。
再補(bǔ)充一點(diǎn)(高階的)內(nèi)容: flush()函數(shù)會(huì)調(diào)用與相應(yīng)流緩沖( streambuf)相聯(lián)系的 sync()函數(shù)(出自MSDN)。
??? 結(jié)語(yǔ)
???
嗯,我希望你現(xiàn)在可以實(shí)現(xiàn)你的文件輸入/輸出程序了。我已經(jīng)將自己所知的內(nèi)容都涉及到,我想它們比你所需要的還要多。即使如此,還是會(huì)有一些內(nèi)容我沒(méi)有提及的……不過(guò)我想你或許都不會(huì)使用到那些方面的內(nèi)容。因此,如果你還需要了解更多關(guān)于某些特定主題的高階的理論,可以在互聯(lián)網(wǎng)上搜索,例如,可以嘗試一下 google.com,但你可別來(lái)問(wèn)我!我不對(duì)任何詢問(wèn)我關(guān)于如何實(shí)現(xiàn)某個(gè)程序此類問(wèn)題的郵件作答復(fù)。
總結(jié)
以上是生活随笔為你收集整理的C++中的文件输入/输出(6):一些有用的函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 对USB驱动程序的理解(1)
- 下一篇: 螺钉装弹垫平垫机器人_一种批量组装螺钉、