文件的輸出操作
想要程序中的數據輸出到文件中,一共需要以下5個步驟:
① 包含fstream頭文件:#include <fstream>
② 建立ofstream對象:ofstream ocout;
③ 將對象與文件關聯:ocout.open(“test.txt”);
④ 使用該對象將數據輸出到文件test中:ocout<<”Hello,C++!”;
⑤ 關閉與文件的連接:ocout.close();
p.s. 在這裡我們應用ofstream的對象ocout將數據直接輸出到了文件中,而不是屏幕上!
完整程序示例:
[cpp]
#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行合並為一句話:
[cpp]
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步合並成一句話:
[cpp]
ifstream icin("test.txt");
它的作用就是調用ifstream類中的構造函數來讀取這個本地的文本文件。
完整的程序示例:
[cpp]
#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()函數原型和參數的介紹哈:
首先是函數原型:
[cpp]
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
);
函數中的參數已經用黑體表示出來了哈,下面是參數說明:
[cpp]
_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行改成:
[cpp]
icin.getline(temp,100);
這就表示把字符數組temp中的內容全部讀取到屏幕上,如下圖所示
OK~~這樣一來,我們就不怕文件中有空格了。
另外,如果我們想要在命令行中寫一段話,而且這段換中包含了空格和回車,那麼我們就應該利用上面getline()函數的第三個參數,因為一段話中有可能會有回車的出現,我們就必須利用getline()的第三個函數將默認的結束符號’\n’換成空字符‘\0’。這是由於空字符的ASCII碼為0,我們不可能在文件中輸入空字符,因此這個時候,getline()函數會一直讀取到文件的末尾才會結束。而如何停止用戶輸入呢?方法其實很簡單,在我們輸入完一段話之後,肯定會按下回車。之後我們就應該向該函數發出EOF標志,即文件結束符標志(End Of File)。在命令行裡面發送文件結束符的方法是“Ctrl+Z”,之後再次按下回車鍵就能停止輸入了。
p.s. 空格不是空字符,它的ASCII碼為32。
下面,咱們用一個實際的例子來演示一下:首先讀取一段話,然後將其輸出到文件中:
[cpp]
#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,那麼接著再次按下Enter回車鍵就會停止輸入。之後在程序的第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鍵的元素的下標,然後將這個下標的元素賦值成空字符就可以了。完整的程序如下:
[cpp]
#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;
然後是程序的輸出: