青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

C++中的文件輸入輸出流

 

C++中的文件輸入/輸出(3)

原作:Ilia Yordanov,  loobian@cpp-home.com

 

掌握輸入/輸出流

 

在這一章里,我會提及一些有用的函數。我將為你演示如何打開一個可以同時進行讀、寫操作的文件;此外,我還將為你介紹其它打開文件的方法,以及如何判斷打開操作是否成功。因此,請接著往下讀!

到目前為止,我已為你所展示的只是單一的打開文件的途徑:要么為讀取而打開,要么為寫入而打開。但文件還可以以其它方式打開。迄今,你應當已經認識了下面的方法:

 

ifstream OpenFile(“cpp-home.txt”);

 

噢,這可不是唯一的方法!正如以前所提到的,以上的代碼創建一個類ifstream的對象,并將文件的名字傳遞給它的構造函數。但實際上,還存在有不少的重載的構造函數,它們可以接受不止一個的參數。同時,還有一個open()函數可以做同樣的事情。下面是一個以上代碼的示例,但它使用了open()函數:

 

ifstream OpenFile;

OpenFile.open(“cpp-home.txt”);

 

你會問:它們之間有什么區別嗎?哦,我曾做了不少測試,結論是沒有區別!只不過如果你要創建一個文件句柄但不想立刻給它指定一個文件名,那么你可以使用open()函數過后進行指定。順便再給出一個要使用open()函數的例子:如果你打開一個文件,然后關閉了它,又打算用同一個文件句柄打開另一個文件,這樣一來,你將需要使用open()函數。

考慮以下的代碼示例:

 

#include <fstream.h>

 

void read(ifstream &T) //pass the file stream to the function

{  

//the method to read a file, that I showed you before

    char ch;

 

    while(!T.eof())

    {

       T.get(ch);

       cout << ch;

    }

   

    cout << endl << "--------" << endl;

}

 

void main()

{

    ifstream T("file1.txt");

    read(T);

    T.close();

 

    T.open("file2.txt");

    read(T);

    T.close();

}

 

據此,只要file1.txtfile2.txt并存儲了文本內容,你將看到這些內容。

現在,該向你演示的是,文件名并不是你唯一可以向open()函數或者構造函數(其實都一樣)傳遞的參數。下面是一個函數原型:

 

ifstream OpenFile(char *filename, int open_mode);

 

你應當知道filename表示文件的名稱(一個字符串),而新出現的則是open_mode(打開模式)。open_mode的值用來定義以怎樣的方式打開文件。下面是打開模式的列表:

名稱

描述

ios::in

打開一個可讀取文件

ios::out

打開一個可寫入文件

ios::app

你寫入的所有數據將被追加到文件的末尾,此方式使用ios::out

ios::ate

你寫入的所有數據將被追加到文件的末尾,此方式不使用ios::out

ios::trunk

刪除文件原來已存在的內容(清空文件)

ios::nocreate

如果要打開的文件并不存在,那么以此參數調用open()函數將無法進行。

ios::noreplace

如果要打開的文件已存在,試圖用open()函數打開時將返回一個錯誤。

ios::binary

以二進制的形式打開一個文件。

 

實際上,以上的值都屬于一個枚舉類型的int常量。但為了讓你的編程生涯不至于太痛苦,你可以像上表所見的那樣使用那些名稱。

下面是一個關于如何使用打開模式的例子:

 

#include <fstream.h>

 

void main()

{

    ofstream SaveFile("file1.txt", ios::ate);

 

    SaveFile << "That's new!\n";

 

    SaveFile.close();

}

 

正如你在表中所看到的:使用ios::ate將會從文件的末尾開始執行寫入。如果我沒有使用它,原來的文件內容將會被重新寫入的內容覆蓋掉。不過既然我已經使用了它,那么我只會在原文件的末尾進行添加。所以,如果file1.txt原有的內容是這樣:

Hi! This is test from www.cpp-home.com!

那么執行上面的代碼后,程序將會為它添上That’s new!,因此它看起來將變成這樣:

Hi! This is test from www.cpp-home.com!That’s new!

假如你打算設置不止一個的打開模式標志,只須使用OR操作符或者是 ,像這樣:

 

ios::ate ios::binary

 

我希望現在你已經明白“打開模式”是什么意思了!

現在,是時候向你展示一些真正有用的東西了!我敢打賭你現在還不知道應當怎樣打開一個可以同時進行讀取和寫入操作的文件!下面就是實現的方法:

 

fstream File(“cpp-home.txt”,ios::in ios::out);

 

實際上,這只是一個聲明語句。我將在下面數行之后給你一個代碼示例。但此時我首先想提及一些你應當知道的內容。

上面的代碼創建了一個名為File流式文件的句柄。如你所知,它是fstream類的一個對象。當使用fstream時,你應當指定ios::inios::out作為文件的打開模式。這樣,你就可以同時對文件進行讀、寫,而無須創建新的文件句柄。噢,當然,你也可以只進行讀或者寫的操作。那樣的話,相應地你應當只使用ios::in或者只使用ios::out —— 要思考的問題是:如果你打算這么做,為什么你不分別用ifstreamofstream來實現呢?

下面就先給出示例代碼:

 

#include <fstream.h>

 

void main()
{

    fstream File("test.txt",ios::in ios::out);

 

    File << "Hi!"; //將“Hi!”寫入文件   

    static char str[10]; //當使用static時,數組會自動被初始化

                //即是被清空為零


    File.seekg(ios::beg); // 回到文件首部

                  // 此函數將在后面解釋

    File >> str;

    cout << str << endl;

 

    File.close();
}

 

OK,這兒又有一些新東西,所以我將逐行進行解釋:

 

fstream File(“test.txt”, ios::in ios::out); —— 此行創建一個fstream對象,執行時將會以讀/寫方式打開test.txt文件。這意味著你可以同時讀取文件并寫入數據。

 

File << “Hi!”; —— 我打賭你已經知道它的意思了。

 

static char str[10]; —— 這將創建一個容量為10的字符數組。我猜static對你而言或者有些陌生,如果這樣就忽略它。這只不過會在創建數組的同時對其進行初始化。

 

File.seekg(ios::beg); —— OK,我要讓你明白它究竟會做些什么,因此我將以一些有點兒離題、但挺重要的內容開始我的解釋。

還記得它么:

 

while(!OpenFile.eof())

    {

       OpenFile.get(ch);

       cout << ch;

    }

 

你是不是曾經很想知道那背后真正執行了什么操作?不管是或不是,我都將為你解釋。這是一個while型循環,它會一直反復,直至程序的操作到達文件的尾端。但這個循環如何知道是否已經到了文件末尾?嗯,當你讀文件的時候,會有一個類似于“內置指針(inside-pointer的東西,它表明你讀取(寫入也一樣)已經到了文件的哪個位置,就像記事本中的光標。而每當你調用OpenFile.get(ch)的時候,它會返回當前位置的字符,存儲在ch變量中,并將這一內置指針向前移動一個字符。因此下次該函數再被調用時,它將會返回下一個字符。而這一過程將不斷反復,直到讀取到達文件尾。所以,讓我們回到那行代碼:函數seekg()將把內置指針定位到指定的位置(依你決定)。你可以使用:

 

ios::beg —— 可將它移動到文件首端

ios::end —— 可將它移動到文件末端

 

或者,你可以設定向前或向后跳轉的字符數。例如,如果你要向定位到當前位置的5個字符以前,你應當寫:

File.seekg(-5);

如果你想向后跳過40個字符,則應當寫:

File.seekg(40);

同時,我必須指出,函數seekg()是被重載的,它也可以帶兩個參數。另一個版本是這樣子的:

File.seekg(-5,ios::end);

在這個例子中,你將能夠讀到文件文本的最后4個字符,因為:

1)你先到達了末尾(ios::end

2)你接著到達了末尾的前五個字符的位置(-5

為什么你會讀到4個字符而不是5個?噢,只須把最后一個看成是“丟掉了”,因為文件最末端的“東西”既不是字符也不是空白符,那只是一個位置(譯注:或許ios::end所“指”的根本已經超出了文件本身的范圍,確切的說它是指向文件最后一個字符的下一個位置,有點類似STL中的各個容器的end迭代點是指向最后一個元素的下一位置。這樣設計可能是便于在循環中實現遍歷)。

你現在可能想知道為什么我要使用到這個函數。呃,當我把“Hi”寫進文件之后,內置指針將被設為指向其后面……也就是文件的末尾。因此我必須將內置指針設回文件起始處。這就是這個函數在此處的確切用途。

File >> str; —— 這也是新鮮的玩意兒!噢,我確信這行代碼讓你想起了cin >> .實際上,它們之間有著相當的關聯。此行會從文件中讀取一個單詞,然后將它存入指定的數組變量中。

例如,如果文件中有這樣的文本片斷:

Hi! Do you know me?

使用File >> str,則只會將“Hi!”輸出到str數組中。你應當已經注意到了,它實際上是將空格作為單詞的分隔符進行讀取的。

由于我存入文件中的只是單獨一個Hi!,我不需要寫一個while循環,那會花費更多的時間來寫代碼。這就是我使用此方法的原因。順便說一下,到目前為止,我所使用的讀取文件的
========================
文件拷貝:

void copyfile(const char* src,const char* des) 

    fstream infile(src,ios::binary); 
    fstream outfile(des,ios::binary); ; 
           
    outfile
<< infile.rd_buf();
}
 

posted on 2007-04-28 11:51 ashura 閱讀(2853) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


<2025年12月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

導航

統計

常用鏈接

留言簿(2)

隨筆分類

隨筆檔案

文章分類

文章檔案

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            中文av一区特黄| 久久黄色小说| 久久午夜视频| 亚洲欧美日韩在线不卡| 欧美视频中文字幕在线| 国产在线麻豆精品观看| 性高湖久久久久久久久| 99精品福利视频| 欧美日韩精品在线播放| 一区二区av在线| 亚洲乱码国产乱码精品精可以看| 欧美精品999| 一本大道久久a久久精二百| 日韩亚洲欧美一区| 国产精品亚洲视频| 牛牛国产精品| 女人天堂亚洲aⅴ在线观看| 一本大道av伊人久久综合| 亚洲一区欧美一区| 伊人色综合久久天天| 牛夜精品久久久久久久99黑人| 欧美sm重口味系列视频在线观看| 欧美一区二区高清| 亚洲国产一二三| 亚洲一级黄色片| 亚洲国产精品黑人久久久| 亚洲美女淫视频| 国内精品久久久久影院色 | 亚洲女同在线| 久久久噜噜噜久久人人看| 9国产精品视频| 久久精品午夜| 先锋影音久久久| 欧美成人资源| 久久亚洲精选| 国产精品久久久久久av下载红粉 | 欧美一区二区三区的| 欧美成人精品h版在线观看| 午夜精品999| 免费欧美在线视频| 久久五月天婷婷| 国产日韩欧美亚洲一区| 夜夜嗨一区二区三区| 在线精品高清中文字幕| 欧美一区二区三区免费观看| 亚洲视频999| 欧美好吊妞视频| 亚洲日本成人女熟在线观看| 国产欧美91| 欧美影院成人| 欧美在线观看视频在线| 国产农村妇女精品一区二区| 日韩一区二区精品视频| 亚洲电影下载| 欧美激情小视频| 亚洲国内在线| 一区二区三区高清| 欧美日韩一区二区在线视频| 欧美黄色一区二区| 亚洲人成网站999久久久综合| 欧美国产专区| 亚洲一区二区三区免费观看| 亚洲欧美日韩一区二区三区在线 | 亚洲影院色无极综合| 亚洲午夜视频| 极品尤物久久久av免费看| 久久久久一区| 最新成人在线| 欧美一区成人| 亚洲精品国产日韩| 国产精品久久国产三级国电话系列| 宅男精品视频| 久久不射电影网| 国产精品a久久久久久| 欧美一区二区精品久久911| 亚洲成人资源网| 久久精品一级爱片| 亚洲精品美女91| 国产欧美91| 欧美大片在线观看一区二区| 亚洲天堂av在线免费观看| 蜜月aⅴ免费一区二区三区| 亚洲美女视频在线观看| 国产午夜精品一区理论片飘花| 麻豆精品视频在线观看| 亚洲一区二区视频| 亚洲高清网站| 久久久久欧美精品| 午夜在线视频一区二区区别| 99国产精品99久久久久久粉嫩| 影音欧美亚洲| 永久免费精品影视网站| 国产伦精品一区二区三区高清版 | 亚洲丶国产丶欧美一区二区三区 | 国产日本亚洲高清| 国产精品jvid在线观看蜜臀 | 香蕉亚洲视频| 午夜精品影院| 亚洲欧美成人综合| 亚洲无线一线二线三线区别av| 亚洲麻豆国产自偷在线| 亚洲欧洲在线免费| 狠狠综合久久av一区二区老牛| 国产亚洲欧美色| 国产精品一区二区欧美| 国产精品久久久一区二区三区| 欧美日韩精品欧美日韩精品一| 欧美日韩精品欧美日韩精品一 | 欧美日本中文| 国产精品家教| 国产午夜亚洲精品不卡| 国产综合色精品一区二区三区| 国产一区二区成人久久免费影院| 国产在线拍揄自揄视频不卡99| 国产午夜精品一区二区三区视频 | 国产一区二区三区在线观看视频 | 国产综合在线视频| 亚洲观看高清完整版在线观看| 亚洲经典在线看| 在线观看精品一区| 99国产精品99久久久久久粉嫩| 欧美在线看片| 亚洲国产三级| 午夜久久久久久| 久久久久成人精品免费播放动漫| 欧美aaaaaaaa牛牛影院| 国产精品v亚洲精品v日韩精品| 伊甸园精品99久久久久久| 在线视频亚洲一区| 老色鬼久久亚洲一区二区| 亚洲人成小说网站色在线| 性色av一区二区三区| 欧美日韩大片一区二区三区| 在线看欧美日韩| 欧美在线看片| 中文av字幕一区| 蜜臀va亚洲va欧美va天堂| 国产欧美日韩在线| 亚洲午夜免费福利视频| 亚洲国产精品免费| 久久国产精品一区二区三区| 欧美日韩国语| 国内成人精品视频| 先锋a资源在线看亚洲| 亚洲视频精品在线| 欧美人成网站| 夜夜嗨av一区二区三区四季av| 免费在线成人| 久久精品视频免费| 红桃视频成人| 久久精品亚洲一区二区三区浴池 | 亚洲无线观看| 国产精品多人| 午夜在线电影亚洲一区| 亚洲精品一区二区在线观看| 麻豆成人综合网| 亚洲精品看片| 亚洲成色777777女色窝| 猫咪成人在线观看| 亚洲国产精品123| 亚洲精品久久久久久久久久久久 | 99视频+国产日韩欧美| 欧美午夜精品久久久久久超碰| 亚洲欧美国产日韩中文字幕| 在线一区亚洲| 国产又爽又黄的激情精品视频| 久久国产精品72免费观看| 久久综合成人精品亚洲另类欧美| 亚洲国产高潮在线观看| 亚洲精品小视频| 国产午夜一区二区三区| 亚洲国产黄色| 国产嫩草影院久久久久| 亚洲福利视频网站| 欧美日韩在线视频首页| 久久久www| 欧美视频一区二区在线观看| 久久夜色精品国产欧美乱极品| 欧美日韩大片| 老色鬼精品视频在线观看播放| 国产精品v一区二区三区| 免费成人性网站| 国产精品久久久久久久久免费樱桃| 久久久久这里只有精品| 国产精品国产一区二区| 美女诱惑一区| 国产欧美1区2区3区| 中文久久精品| 宅男噜噜噜66一区二区66| 久久久欧美精品sm网站| 欧美一区二区视频97| 国产精品嫩草影院av蜜臀| 99日韩精品| 这里只有精品视频在线| 欧美1区2区| 亚洲人被黑人高潮完整版| 在线观看福利一区| 噜噜噜久久亚洲精品国产品小说| 久久久久久久久久久久久女国产乱| 欧美性一区二区|