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++ fstream流的eof()函式多讀一行的問題
最近幫老師帶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. 說明:雖然複製建構函式屬於建構函式的一種,有共同的地方,但是也具有一定的特殊性,所以在總結它的性質時將它單獨列出來了。