===========================前言===========================
我們在編寫程式的時候,最密不可分的就是對檔案進行相應的操作,我們可以從檔案中讀取資料,可以将資料儲存到檔案,可以……
總而言之,言而總之,一言以蔽之,對檔案的操作是非常重要的,下面我們就來介紹一下C++中是如何對檔案進行操作的。
===========================功能展示===========================
- 檔案的輸出操作
想要程式中的資料輸出到檔案中,一共需要以下5個步驟:
① 包含fstream頭檔案:#include <fstream>
② 建立ofstream對象:ofstream ocout;
③ 将對象與檔案關聯:ocout.open(“test.txt”);
④ 使用該對象将資料輸出到檔案test中:ocout<<”Hello,C++!”;
⑤ 關閉與檔案的連接配接:ocout.close();
p.s. 在這裡我們應用ofstream的對象ocout将資料直接輸出到了檔案中,而不是螢幕上!
完整程式示例:
#include <fstream>
using namespace std;
int main()
{
ofstream ocout;
ocout.open("test.txt");
ocout<<"Hello,C++!";
ocout.close();
return 0;
}
運作程式後,我們就會在程式的目錄下發現一個test.txt檔案,打開之後會顯示“Hello,C++!”。如下圖所示

特别注意的是,我們也可以把上面程式的第6和第7行合并為一句話:
ofstream ocout("test.txt");
這句話的意思就是調用ofstream類中的構造函數來建立這個文本檔案。另外,我們需要特别注意一點,在完成對整個檔案的操作之後,一定要用close()函數将這個檔案關閉了,否則在程式結束後,所操作的檔案将什麼都不會儲存下來!!!
- 讀取檔案中的資料
打開檔案讀取資料的方法和輸出資料到文集中的方法基本上是一樣的,同樣也需要5個步驟:
① 包含fstream頭檔案:#include <fstream>
② 建立ifstream對象:ifstream icin;
③ 将對象與檔案關聯:icin.open(“test.txt”);
④ 使用該對象讀取檔案test中的資料到數組temp中:icin>>temp;
⑤ 關閉與檔案的連接配接:icin.close();
p.s同上面一樣,我們也可以将第2步和第3步合并成一句話:
ifstream icin("test.txt");
它的作用就是調用ifstream類中的構造函數來讀取這個本地的文本檔案。
完整的程式示例:
#include <fstream>
#include <iostream>
using namespace std;
int main()
{
ifstream icin;
icin.open("test.txt");
char temp[100];//定義一個字元數組temp
icin>>temp;//将檔案中的資料讀到字元數組temp中
cout<<temp<<endl;//将temp中存放的内容輸出到螢幕上
return 0;
}
運作之前,我們需要在該檔案夾下建立test.txt檔案,其中的内容就是上面的“Hello,C++!”。那麼輸出如下:
可以看到,程式在指令行中顯示出來了test.txt文本檔案中的内容。
- 如何讀取空格和空格後面的字元
我們在寫檔案的時候,空格是不可避免的。但是由于C++的插入操作符有一個毛病,它隻要一遇到空字元便會停止輸出。這裡的空字元就是空格,或者是’\0’。那麼這樣一來,如果我們在檔案中有空格字元,那麼空格後面的字元就無法被輸出到螢幕上了。比如說,我們建立的test.txt檔案中的内容為:Hello C++!即把Hello後面的逗号改成空格,那麼重新運作該程式,輸出如下:
那麼有沒有什麼解決方法呢,當然是有的哈。用getline()函數嘛。下面粘一段MSDN上面關于getline()函數原型和參數的介紹哈:
首先是函數原型:
template<class CharType, class Traits, class Allocator>
basic_istream<CharType, Traits>& getline(
basic_istream<CharType, Traits>& _Istr,
basic_string<CharType, Traits, Allocator>& _Str
);
template<class CharType, class Traits, class Allocator>
basic_istream<CharType, Traits>& getline(
basic_istream<CharType, Traits>& _Istr,
basic_string<CharType, Traits, Allocator>& _Str,
const CharType _Delim
);
函數中的參數已經用黑體表示出來了哈,下面是參數說明:
_Istr
The input stream from which a string is to be extracted.
指明輸出的緩沖區是誰
_Str
The string into which are read the characters from the input stream.
讀取到流中的字元資料
_Delim
The line delimiter.
結束符号
(預設的結束符号是’\n’,而這裡采用自定義的結束符号替換掉預設的結束符号。意思就是輸出遇到_Delim才會停止輸出)
好了,有了這個函數,我們就可以把上面的程式中的第10行改成:
icin.getline(temp,100);
這就表示把字元數組temp中的内容全部讀取到螢幕上,如下圖所示
OK~~這樣一來,我們就不怕檔案中有空格了。
另外,如果我們想要在指令行中寫一段話,而且這段換中包含了空格和回車,那麼我們就應該利用上面getline()函數的第三個參數,因為一段話中有可能會有回車的出現,我們就必須利用getline()的第三個函數将預設的結束符号’\n’換成空字元‘\0’。這是由于空字元的ASCII碼為0,我們不可能在檔案中輸入空字元,是以這個時候,getline()函數會一直讀取到檔案的末尾才會結束。而如何停止使用者輸入呢?方法其實很簡單,在我們輸入完一段話之後,肯定會按下回車。之後我們就應該向該函數發出EOF标志,即檔案結束符标志(End Of File)。在指令行裡面發送檔案結束符的方法是“Ctrl+Z”,之後再次按下Enter鍵就能停止輸入了。
p.s. 空格不是空字元,它的ASCII碼為32。
下面,咱們用一個實際的例子來示範一下:首先讀取一段話,然後将其輸出到檔案中:
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
const int num=255;
char temp1[num]={0};//初始化數組temp1
char temp2[num]={0};//初始化數組temp2
//① 輸出資料到檔案text.txt中
ofstream f_out("text.txt");
cout<<"請輸入文本的内容:\n";
cin.getline(temp1,num,0);
f_out<<temp1;
f_out.close();
//② 将檔案text.txt中的内容重新讀回螢幕上
ifstream f_in("text.txt");
f_in.getline(temp2,num,0);
cout<<temp2<<endl;
return 0;
}
對整個程式的分析:
① 輸出資料到檔案text.txt中
首先我們在第11行定義了一個檔案的輸出流對象f_out,并用該對象建立了一個text.txt文本檔案。之後在程式的第13行采用getline()函數接受文本内容,并将其放到temp1字元數組中。注意,這裡的getline()函數的第三個參數為空字元,說明它可以接受空格,并且隻有達到檔案的末尾才能停止讀取使用者的鍵盤輸入。好了,如果我們輸入完檔案之後按下Ctrl+Z,那麼接着再次按下EnterEnter鍵就會停止輸入。之後在程式的第14行,我們用ofstream的對象fout将緩沖區中的内容輸出到文本檔案text.txt中。最後關閉這個檔案。
② 将檔案text.txt中的内容重新讀回螢幕上
同輸出一樣,首先我們在程式的第17行定義了一個檔案的輸入流對象f_in,并用該對象讀取了剛剛建立的text.txt文本檔案。之後又調用getlin()函數将檔案中的内容輸出到了字元數組temp2中,之後運用cout來輸出temp2數組的内容到螢幕上。這樣一來,我們就完成了對檔案的輸入輸出操作。
其運作的結果如下:
OK啦!!!程式輸出成功咯!!但是這個程式還有一個小小的瑕疵,注意看上面輸出結果,我們可以看到在指令行中“請按任意鍵繼續…”上面居然還有一個回車!這是怎麼回事呢?我們并沒有在多輸出一個回車啊?
其實是有的!!!!注意,我們在“!”之後回了一次車,然後才輸出了ctrl+Z,向getline()函數發送了一個檔案結束的标志。之後為了讓程式結束,又按了一下回車。那麼這裡面第2次按下的回車由于超出了檔案結束符EOF被自動抛棄了,但是,第一次按下的回車,就是!之後的那個回車卻沒有被丢棄掉,而是被寫入了temp1函數中。這個就是問題的所在。是以我們在輸出之後,會看到在“請按任意鍵繼續…”上面居然還有一個回車!對于這個問題,解決方法其實很簡單,我們隻需要把最後一個Enter改成空字元’\0’就可以了。即在程式的13行之後添加上這樣兩句話:
int n=strlen(temp1);
temp1[n-1]='\0';
第一句話的意思就是讀取字元數組temp1中可見字元的長度,并儲存到整型變量n中;第二句話的意思就是找到儲存Enter鍵的元素的下标,然後将這個下标的元素指派成空字元就可以了。完整的程式如下:
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
const int num=255;
char temp1[num]={0};//初始化數組temp1
char temp2[num]={0};//初始化數組temp2
//① 輸出資料到檔案text.txt中
ofstream f_out("text.txt");
cout<<"請輸入文本的内容:\n";
cin.getline(temp1,num,0);
int n=strlen(temp1);
temp1[n-1]='\0';
f_out<<temp1;
f_out.close();
//② 将檔案text.txt中的内容重新讀回螢幕上
ifstream f_in("text.txt");
f_in.getline(temp2,num,0);
cout<<temp2<<endl;
return 0;
}
然後是程式的輸出:
好了,終于把這個程式搞定了,好麻煩!!!呼呼~~
這篇博文就記錄這麼多了,下次接着學習關于C++對檔案的操作的方法,^_^
轉載于:https://www.cnblogs.com/uniqueliu/archive/2011/08/03/2126545.html