關於fefo函數

来源:http://www.cnblogs.com/TianyuSu/archive/2016/12/30/6235367.html
-Advertisement-
Play Games

feof是C語言標準庫函數函數,其原型在stdio.h中,其功能是檢測流上的文件結束符。 函數原型: 1 #include<stdio.h> 2 #include<stdlib.h> 3 int main(){ 4 FILE *pt,*pt1; 5 char ch; 6 pt=fopen("in.t ...


 

feof是C語言標準庫函數函數,其原型在stdio.h中,其功能是檢測流上的文件結束符。

函數原型:

int feof(FILE *stream);
返回值:如果文件結束,則返回非0值,否則返回0
在使用過程中發現一些問題:
demo1:功能,複製文件內容
 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 int main(){
 4     FILE *pt,*pt1;
 5     char ch;
 6     pt=fopen("in.txt","r");
 7     pt1=fopen("out.txt","w");
 8     if(!pt || !pt1){
 9         printf("Open error!\n");
10         exit(0);
11     }
12     while(!feof(pt)){
13         putchar(ch=fgetc(pt));
14         printf("\t%d\n",ch);
15         putc(ch,pt1);
16     }
17     return 0;
18 }
View Code

in.txt:123                   size:3byte

out.txt:123            size:4byte

運行截圖:

分析:

通過這個代碼,我們原本想複製in.txt中的文本到out.txt中,但是結果顯示out.txt文件體積變大,為什麼會這樣呢?

首先,我們把每一個從in.txt讀取到的字元輸出到屏幕並且輸出其ASCII碼,結果顯示迴圈了4次,和我們想的不太一樣。問題就出在這裡,在我們認為while()迴圈執行到第3次的時候,第4次是不可以進入迴圈的。但事實上,程式進入了迴圈體,並且還讀到了一個字元,用putchar()無法輸出,但是其整形輸出為-1,可以猜想到是讀到了EOF。這時我們回到迴圈條件,發現feof函數檢測的是上一次是否讀入成功,而不是檢測本次是否可讀,起始執行feof函數返回0,當讀完3的時候,feof狀態為0,因此還是滿足迴圈條件,進入迴圈,這時就讀取到了EOF,就會出現輸出-1的情形,文件隨之也會被擴大。

解決方法:

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 int main(){
 4     FILE *pt,*pt1;
 5     char ch;
 6     pt=fopen("in.txt","r");
 7     pt1=fopen("out.txt","w");
 8     if(!pt || !pt1){
 9         printf("Open error!\n");
10         exit(0);
11     }
12    while(~(ch=fgetc(pt))){
13         putchar(ch);
14         printf("\t%d\n",ch);
15         putc(ch,pt1);
16     }
17     return 0;
18 }
View Code

通過檢測getc()的返回值來確定是否執行到文件末尾標記符,當讀取到EOF時,函數返回-1,因此不會進入迴圈體。

運行截圖:

輸出文件: out.txt 內容為:123      size:3byte

-------------------------------------------------------------------------------

用過這樣的解決方法可以得到相同大小的複製文件,因此在使用feof()函數的時候,需要考慮到函數檢測的是上一次的讀取狀態而非本次讀取狀態。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 看過我WPF 微信 MVVM這篇文章的朋友,應該知道我裡面提到了我有一個小號是無法獲取列表的,始終也沒找到原因。 前兩天經過GitHub上h4dex大神的指導,知道了原因,是因為微信在登錄以後,web微信採取了不同的功能變數名稱來相容各種用戶。 下麵是大神提供的js代碼和C#代碼 function () { ...
  • 今日問題: 請問主程式輸出結果是什麼?(點擊以下“【Java每日一題】20161230”查看20161229問題解析) 題目原發佈於公眾號、簡書:【Java每日一題】20161230,【Java每日一題】20161230 註:weknow團隊近期開通並認證了分答,歡迎大家收聽,有問題也歡迎到分答來咨 ...
  • 一、方法函數 函數也稱為方法,就是定義在類中的具有特定功能的一段獨立代碼。用於定義功能,提高代碼的復用性。 函數的特點1> 定義函數可以將功能代碼進行封裝,便於對該功能進行復用;2> 函數只有被調用才會被執行;3> 對於函數沒有具體返回值的情況,返回值類型用關鍵字void表示,那麼該函數中的retu ...
  • 1、什麼是指針? 指針就是地址。 為了說清楚什麼是指針,必須先弄清楚數據在記憶體中是如何存儲的,又是如何讀取的。 如果在程式中定義了一個變數,在對程式進行編譯時,系統就會給這個變數分配記憶體單元。編譯系統根據程式中定義的變數的類型,分配一定長度的空間。 記憶體區的每一個位元組都會有一個編號,這就是“地址”, ...
  • 前提: 1.已安裝python版本(一般都是2.X) 2.已安裝easy_install python安裝,記得配置Python的環境變數,例如:我的直接在Path上加 G:\Python 驗證安裝Python成功:cmd 輸入python 或者python -V 這是下載easy_install的 ...
  • 關於volatile,找了一堆資料看,看完後想找一個方法去做測試,測了很久,感覺跟沒有一樣。 這本書《深入理解Java記憶體模型》,對volatile描述中有這樣一個比喻的說法,如下代碼所示,對a的讀寫相當於對b的同步讀寫。 也就是說,volatile只保證了讀與寫的同步,每次讀取都是得到最新值,每次 ...
  • 1. 前言 Java和C++之間顯著的一個區別就是對記憶體的管理。和C++把記憶體管理的權利賦予給開發人員的方式不同,Java擁有一套自動的記憶體回收系統(Garbage Collection,GC)簡稱GC,可以無需開發人員干預而對不再使用的記憶體進行回收管理。 垃圾回收技術(以下簡稱GC)是一套自動的內 ...
  • 為什麼要用抽象類: 子類萬一沒有重寫正確,也沒有提示。 假設父類的代碼如下 子類中的代碼如下:對父類中的方法的重寫 這樣的代碼,在Eclipse中是不會報錯的; 抽象類:不知道是具體什麼東西的類。 寫法:abstract class 類名 抽象方法:不知道是具體是做什麼的方法; 寫法:abstrac ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...