1. 程式人生 > >C++ 輸入流 cin/ ifstream/ istringstream 及幾個相關函式在遇到檔案結束符EOF時的行為

C++ 輸入流 cin/ ifstream/ istringstream 及幾個相關函式在遇到檔案結束符EOF時的行為

以下內容分別在VC6.0 和 g++ 4.7下測試:

輸入流在遇到檔案結束符時會設定其eofbit,但此時在兩個編譯器上直接測試流得到的結果都為真,同時eof()也為真,舉例如下:

#include <iostream>

#include <string>

#include <sstream>

using namespace std;

int main()

{

      istringstream istr("loveyou");

      string test;

      istr >> test;       //這裡遇到了EOF

      if(istr.eof())

            cout << "eofbit is set" << endl;

     if(istr)

            cout << "istr is valid" << endl;

      //istr.seekg(0, istringstream::beg);

      //istr.tellp();

      if(istr.good())

            cout << "the stream can still be used" << endl;

      return 0;

}

兩個編譯器上執行的結果都是:

eofbit is set

istr is valid

也就是說雖然if(istr)為真,但是這時候已經不能在用istr流來輸入了,因為istr.good()為假,流已經無效了。但是此時如果將istr.seekg(0, istringstream::beg);前面的註釋//刪除,編譯後在VC6.0和g++ 4.7中將得到不同的結果:VC6.0輸出結果保持不變,但是g++中結果如下:

eofbit is set

istr is valid

the stream can sitll be used

兩種編譯器中seekg都會將位置指標移動到指定的位置,此處為istringstream::beg,但是g++還會同時清除eofbit,使流重新可用,但VC卻不會清除它,流已經不可正確使用。

在g++中tellp()只有在istr.good()為真時才能給出正確結果,在eof()或fail()為真時都返回錯誤值:-1

在VC6.0中tellp()在eof()為真時也可以正確呼叫,給出正確位置,在fail()為真時也會返回:-1

在兩個編譯器中呼叫istr.str(s)函式(如istr.str("love you"))都會把位置指標設定到開頭,但是都不會清除eofbit。在流已經到達檔案結尾時,之後呼叫istr.str("love you"),為流istr設定了新值,接下的輸入也都會失敗:如

      istringstream istr("loveyou");

      string test;

      istr >> test;

      istr.str("love you");

      if(istr.eof())

            cout << "eofbit is set" << endl;

      string s;

      istr >> s;

      cout << s << endl;

兩種編譯器的執行結果都為:

eofbit is set

在g++中在istr.str("love you");下面加上一句istr.seekg(0, istringstream::beg);來清除eofbit,可以輸出正確結果但是更通用的辦法是不要依賴編譯器特性:我們應該用istr.clear()來清除流中的錯誤狀態,以使得流再次可用:

istringstream istr("loveyou");

      string test;

      istr >> test;

      istr.clear();

      istr.str("love you");

      if(istr.eof())

            cout << "eofbit is set" << endl;

      string s;

      istr >> s;

      cout << s << endl;

這樣便會得到正確結果:

love

clear()函式會清除流的錯誤狀態,並且不會改變流中的位置。

希望本文對大家有幫助!

相關推薦

C++ 輸入 cin/ ifstream/ istringstream 相關函式在遇到檔案結束符EOF行為

以下內容分別在VC6.0 和 g++ 4.7下測試: 輸入流在遇到檔案結束符時會設定其eofbit,但此時在兩個編譯器上直接測試流得到的結果都為真,同時eof()也為真,舉例如下: #include <iostream> #include <string&

FI中替代和校驗的相關函式

替代(Substitution): FI_SUBSTITUTION_HEADER FI_SUBSTITUTION_ITEM FI_SUBSTITUTION_DOC FI_SUBSTITUTION_AC

C++輸入和輸出、緩衝區

一、C++輸入流和輸出流 輸入和輸出的概念是相對程式而言的。 鍵盤輸入資料到程式叫標準輸入,程式資料輸出到顯示器叫標準輸出,標準輸入和標準輸出統稱為標準I/O,檔案的輸入和輸出叫檔案I/O。   cout——標準輸出流,全域性流物件,輸出資料到顯示器 cin——標準輸入流,鍵盤

C++輸入和輸出、緩沖區

一個 驅動器 掌握 輸入數據 tle 處理 字符串 輸出格式 效率 一、C++輸入流和輸出流 輸入和輸出的概念是相對程序而言的。 鍵盤輸入數據到程序叫標準輸入,程序數據輸出到顯示器叫標準輸出,標準輸入和標準輸出統稱為標準I/O,文件的輸入和輸出叫文件I/O。 co

C++輸入問題

簡介 學C++的時候,這幾個輸入函式弄的有點迷糊;這裡做個小結,為了自己複習,也希望對後來者能有所幫助,如果有差錯的地方還請各位多多指教1、cin 2、cin.get() 3、cin.getline() 4、getline() 5、gets() 6、getchar()附:ci

C++的memset的使用原理種基礎用法

1.使用原理 先來看看C標準庫裡面memset的原始碼 void *(memset)(void *s, int c, size_t n) { const unsigned cha

C++輸入詳解

C++中幾個輸入函式的用法和區別(cin、cin.get()、cin.getline()、getline()、gets()、getchar())) 1、cin1、cin.get()2、cin.getline()3、getline()4、gets()5、getchar()1、c

C++ 輸入

簡介 學C++的時候,這幾個輸入函式弄的有點迷糊;這裡做個小結,為了自己複習,也希望對後來者能有所幫助,如果有差錯的地方還請各位多多指教 1、cin 2、cin.get() 3、cin.getline() 4、getline() 5、gets

秋招後實習初感小flag

秋招      歷經20多天的秋招,每天機器人般的生活,早起奔波於各大宣講會,參加一場又一場的筆試,晚上懷著忐忑的心情等著面試通知,從剛開始的興奮到後來的麻木,面試已經全靠本能去回答,終於也是拿了幾個還算滿意的offer,結束了自己的秋招,開始了人生的第一份職場生活

C#中form窗體之間的傳遞方法學習

在windows form之間傳值,我總結了有四個方法:全域性變數、屬性、窗體建構函式和delegate。 第一個全域性變數: 這個最簡單,只要把變數描述成static就可以了,在form2中直接引用form1的變數,程式碼如下: 在form1中定義一個static

第九屆藍橋杯省賽JAVA語言 C組題解_題4 第幸運數

JAVA語言 C組題解_題4 第幾個幸運數 題目 解題思路 題目 標題:第幾個幸運數 到x星球旅行的遊客都被髮給一個整數,作為遊客編號。 x星的國王有個怪癖,他只喜歡數字3,5和7。 國王規定,遊客的編號如果只含有因子

Photoshop摳圖(磁性套索工具常用案例)

ctrl + n 新建 ctrl + o 開啟 ctrl + s 儲存 shift + ctrl + s 另存為 “{” 圖片縮小 “}” 圖片放大 圖片大於可視區,按一下”空格鍵“,滑鼠變手勢,可移動圖片 ctrl + t 自由變換圖層 ctrl + c 複製 ctrl + x 剪下 ctrl + v

python之寫了3週末晚上的ftp終於完成了

本程式已上傳githup,點我 作業:開發一個支援多使用者線上的FTP程式 要求: 使用者加密認證 允許同時多使用者登入 每個使用者有自己的家目錄 ,且只能訪問自己的家目錄

C++中const與static使用的要點

(1) const使用要點 為什麼要使用const? const是定義常量的,而且const定義的常量是有資料型別的,而巨集常量是沒有資料型別的,所以編譯器可以對const常量進行型別安全檢查,而對巨集常量只是簡單的替換,沒有型別安全檢查,容易出錯。

C++面試常見的函式詳解

strcpy() 原型宣告:char strcpy(char dest, const char *src);  功能:把從src地址開始且含有NULL結束符的字串複製到以dest開始的地址空間  說明:src和dest所指記憶體區域不可以重疊且dest必須有足夠的空間來容

java中字元一次到底讀位元組?

馬克-to-win:注意如果當遇到英文時,字元流足夠聰明,一次就讀一個位元組,如遇到中文,一次讀兩個位元組。比如a就佔一個位元組,即97.見下面的例子。我們摘錄一段java官方文件:Each invocation of one of an InputStreamReader

如何把一個檔案壓縮成固定大小的檔案解壓縮

簡述: 本文簡單介紹了WinRAR如何把一個檔案壓縮成幾個固定大小的檔案以及如何解壓這幾個檔案。 1、壓縮 1 > 滑鼠選中待壓縮檔案-右鍵-新增到壓縮檔案。 2 >

C語言中自我遞迴的例子

遞迴 遞迴就是一個函式在它的函式體內呼叫它自身。執行遞迴函式將反覆呼叫其自身,每呼叫一次就進入新的一層。 遞迴函式必須有結束條件。 遞迴分為回推和遞推兩個階段,當一直回推,直到遇到牆後返回,這個牆就是結束條件。 所以遞迴要有兩個要素,回推牆與遞推關係 例

遞迴整理經典題目

什麼是遞迴 百度百科:程式呼叫自身的程式設計技巧稱為遞迴( recursion)。 借用知乎上Memoria的回答: 假設你在一個電影院,你想知道自己坐在哪一排,但是前面人很多,你懶得去數了,於是你問前一排的人「你坐在哪一排?」,這樣前面的人 (代號