1. 程式人生 > >C++ fstream流的eof()函式多讀一行的問題

C++ fstream流的eof()函式多讀一行的問題

最近幫老師帶C++的課程設計,很多同學在使用很多fstream流的eof()函式進行

        while(!readfile.eof())
        {
            readfile>>x;
        }

時,會出現將最後一行資料讀兩次。
eof是end of file的意思,用來判斷是否到了檔案結尾。微軟的文件說明如下:

bool eof( ) const;
Return Value
true if the end of the stream has been reached, false otherwise.
Remarks
The member function returns true if rdstate & eofbit is nonzero. For more information on eofbit,
see ios_base::iostate.

按照一般思維,應該就是到達檔案尾,就eof()應返回true,但事實上,在讀完最後一個數據時,eofbit仍然是false。只有當流再往下讀取時,發現檔案已經到結尾了,才會將標誌eofbit修改為true。這也就是為什麼使用while(!readfile.eof())會出多現讀一行的原因。
既然已經知道了原因,那麼,為了避免這樣的情況,可以使用readfile.peek()!=EOF來判斷是否到達檔案結尾,這樣就能避免多讀一行。更改為:
    while(readfile.peek()!=EOF)
    {
        readfile>>x;
    }
但是應注意,檔案中最後一個數據之後,不應有多餘的空白行。

此文章源自於【http://www.cnblogs.com/zhengxiaoping/p/5614317.html】

相關推薦

C++ fstreameof()函式一行的問題

最近幫老師帶C++的課程設計,很多同學在使用很多fstream流的eof()函式進行 while(!readfile.eof()) { readfile>>x; } 時,會出現將最

關於feof函式一次的問題

在完成通訊錄的過程中總是多讀出一個0,對此我進行了多次除錯。 下面是成功的程式碼 void load_txl(Link *head) {Link temp = *head;Link newnode = NULL;FILE *fp;int i;if((fp = fopen("

C++利用一個fstream寫檔案

原文地址:https://blog.csdn.net/qq_34176290/article/details/80260377 fstream物件可以同時具有ifstream和ofstream的功能,嘗試使用一個流對檔案進行讀寫的程式碼如下:

C語言fread()函式檔案函式(從檔案讀取資料)

相關函式:fopen, fwrite, fseek, fscanf標頭檔案:#include <stdio.h>定義函式:size_t fread(void * ptr, size_t size, size_t nmemb, FILE * stream);函式說

使用C++檔案fstream寫操作十六進位制文字檔案

最近為智慧移動小車編寫上位機軟體的過程中,遇到了檔案讀寫處理的任務,檔案是一般的文字檔案.txt格式的,其內容由十六進位制資料組成。檔案內資料的格式如下: FF FD 03 FD 77 FE 77 1C 27 FF FD 01 FE 00 FE 00 1E 28 FF FE

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

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

c語言 用getchar函式入兩個字元給c1 c2 用putchar和printf輸出 思考問題

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

C++ 控制函式setw()、setfill()、setbase()、setprecision()的使用

標頭檔案: #include <iostream> #include <iomanip> 功能: std::setw :需要填充多少個字元,預設填充的字元為' '空格 std::setfill:設定std::setw將填充什麼樣的字元,如:std::setfill('*')

C 按行讀取檔案(但是最後一行會輸出一行

#include <stdio.h>   int main()  {      char filename[] = "E:\\data_test\\commands.txt"; //檔名   &nb

C++ fstream 檔案

C++ ,中,所有的I/O操作 都以 stream 類 為 基類,包括我們要認識檔案I/O,stream這個類有兩個重要的運算子: 1、插入器(<<)   向流輸出資料。比如說系統有一個預設的標準輸出流(cout),一般情況下就是指的顯示器,所以,cout<<"Write

c++繼承和組合,型,虛擬函式c++後期繫結的本質)

組合和繼承,實現了程式碼的可擴充套件性和相容性。 多型是在虛擬函式上得到了支援。 多型的原理,函式的呼叫繫結: 把函式的呼叫和函式體相關聯稱為捆綁。當捆綁是在程式執行之前完成的,稱為早期捆綁。c語言只支援早期繫結。晚期捆綁,物件通過自身得到類的資訊,然後找

(C/C++學習心得)5.C++中的虛繼承-虛擬函式-型解析

1 #include<iostream> 2 using namespace std; 3 4 class bed 5 { 6 public: 7 bed(float l,float wi,float we) 8 :len(l),wid(w

C++中過載,覆蓋,隱匿,函式

C++的多型特性是這門語言很重要的一個特性。 一、靜態多型:編譯器在編譯期間完成的,編譯器根據函式實參的型別(可能會進行隱式型別轉換),可推 斷出要呼叫那個函式,如果有對應的函式就呼叫該函式,否則出現編譯錯誤。 二、動態多型:在程式執行期間(非編譯期

解決c++ ifstream in物件讀取檔案總一次問題

先上原始碼 #include <iostream> #include <fstream> #include "xitong.h" using namespace std; int

C++ /檔案 /BMP檔案

把一個字元寫到輸出流中:cout.put('c'); // 輸出一個字元 cout<<'c'; // 輸出一個字元,但是此前設定的寬度和填充方式在此起作用 write 函式: 把記憶體中的一塊兒內容寫到一個輸出檔案中,該函式有兩個引數:一個char指標(指向記憶體資料的起始地址)和一個所寫位元組數

C++檔案

在看C++程式設計思想中,每個練習基本都是使用ofstream,ifstream,fstream,以前粗略知道其用法和含義,在看了幾位大牛的博文後,進行整理和總結: 這裡主要是討論fstream的內容: [java] view plain copy print

【程式碼備忘】C++ fstream 寫 unicode 檔案

歡迎加入我們的QQ群,無論你是否工作,學生,只要有c / vc / c++ 程式設計經驗,就來吧!158427611  所謂的unicode檔案,無非就是在檔案頭部插入了 0xFFFE的標誌。。。讀寫的時候對應的讀寫 就可以了。 namespace fileStream

C++ fstream 寫 unicode 檔案

所謂的unicode檔案,無非就是在檔案頭部插入了 0xFFFE的標誌。。。讀寫的時候對應的讀寫 就可以了。namespace fileStream  {      bool readFile_Unicode( const string &file ,wstring 

C++:11---虛擬函式、虛擬函式表、型、純虛擬函式(抽象類、介面)

 介紹虛擬函式之前,先舉一個繼承中的例項 class A { public: void show()const {cout<<"A";}; }; class B:public A //B繼承於A { public: void show()cons

C++在單繼承、繼承、虛繼承時,建構函式、複製建構函式、賦值操作符、解構函式的執行順序和執行內容

一、本文目的與說明     1. 本文目的:理清在各種繼承時,建構函式、複製建構函式、賦值操作符、解構函式的執行順序和執行內容。     2. 說明:雖然複製建構函式屬於建構函式的一種,有共同的地方,但是也具有一定的特殊性,所以在總結它的性質時將它單獨列出來了。