1. 程式人生 > >LINUX下使用風格特色讀去檔案最後一行兩次

LINUX下使用風格特色讀去檔案最後一行兩次

fgets兩次讀取檔案最後一行?
#include <stdlib.h>;
#include <stdio.h>;

int main()
{
FILE *fp;
char ch[11];
fp = fopen("jjk.txt","r");
while(!feof(fp))     //-----------------問題在這裡
{
   memset(ch, 0, sizeof(ch));
   fgets((char *)ch, sizeof(ch)-1, fp);
   printf("%s",ch);
}
fclose(fp);
}

[/code]
jjk.txt內容:
aaa
bbb
輸出結果:
aaa
bbb
bbb

問題原因解釋:
feof是ANSI標準定義的:在遇到檔案結束時返回非0值。
對於象DOS系統,這比較方便。因為檔案有明確的結束標誌EOF。
對於UNIX,就稍微麻煩一點。因為檔案沒有結束標誌,只有通過當前指標和檔案長度來判斷檔案是否結束。當read時,先呼叫trap進入核心態,由FILE->;ile->;inode,取得檔案的實體地址,然後取得檔案的剩餘的長度,比較該長度是否為0,如果為0則置檔案結束標誌;如果不為0,則比較該長度和要讀的長度,取其中的小值,並將檔案內容讀入使用者地址。
具體到你所遇到的現象就比較清晰了,讀檔案最後一行的fgets(也是呼叫read的)被呼叫的時候,該檔案的剩餘長度不為0,所以不置檔案結束標誌。而再fgets時,檔案的剩餘長度為0,檔案結束標誌被置且馬上返回。
另外,注意到feof返回的是_IOEOF而不是ANSI定義的EOF。

解決方法:

ile(fgets(ch, sizeof(ch)-1, fp) != NULL)
   printf("%s",ch);

相關推薦

LINUX使用風格特色檔案最後一行

fgets兩次讀取檔案最後一行?#include <stdlib.h>;#include <stdio.h>;int main(){FILE *fp;char ch[11];fp = fopen("jjk.txt","r");while(!feof(f

linux使用C++程式操作檔案寫(複製/拷貝)

注意:在linux下使用eclipse+CDT執行下面的程式時,請在root狀態下!!!在終端中,進入root狀態,然後在root狀態下,開啟eclipse,再執行下面的程式。(因為涉及到檔案讀寫許可權,普通狀態可能無法完成操作,root狀態下會更好一些。)一.關於檔案操作的

檔案所有檔案

 public static List<String> readfile(String filepath) throws FileNotFoundException, IOException {     List<String> list = new

Linux測試磁碟寫速度

 1.測/目錄所在磁碟的純寫速度: time dd if=/dev/zero bs=1024 count=1000000 of=/1Gb.file 2.測/目錄所在磁碟的純讀速度: time dd if=/1Gb.file bs=64k |dd of=/dev/null

Linux使用tail查詢日誌檔案關鍵詞有顏色、高亮顯示

Linux下使用tail查詢日誌檔案關鍵詞高亮顯示 單個關鍵詞高亮顯示: tail -f 日誌檔案 | perl -pe 's/(關鍵詞)/\e[1;顏色$1\e[0m/g' tail -f catalina.out | perl -pe 's/(DEBUG)/\e[1;34m$

linux安裝mysql(rpm檔案安裝)

資料庫包下載: https://www.mysql.com/downloads/ 在GPL開原協議的社群開源版裡邊下載     我們用mysql community server裡邊的         其中workbench是客戶

LinuxNFS提供的共享檔案服務(企業級)

NFS NFS(Network File System)即網路檔案系統,是FreeBSD支援的檔案系統中的一種,它允許網路中的計算機之間通過TCP/IP網路共享資源。在NFS的應用中,本地NFS的客戶端應用可以透明地讀寫位於遠端NFS伺服器上的檔案,就像訪問本地檔案一樣。 好處

linux 使用 ftp 下載 rpm 檔案並安裝時提示 rpmReadSignature 錯誤

  想下載並安裝一個花生殼客戶端(CentOS 6.5 x64),使用 wget 一直無法成功,只好在主機(Win7 SP1 x64)上用工具下載,然後放到主機裡設定的一個簡單的ftp server裡,再在伺服器裡下載。可一直提示rpmReadSignature 錯誤,導致無法安裝。原來只要在

Linux解壓rar格式檔案

首先:rar檔案與zip tar.gz等等開源壓縮檔案是不一樣的,rar型別的壓縮協議是不開源的,所以linux系統自身是沒有安裝rar的解壓工具的,所以我們需要自己下載rar工具,注:由於rar型別並不可以,理論上是要收費的,所以我們在往伺服器上傳檔案時,儘量避免使用rar

Linux使用scp命令進行檔案遠端拷貝

scp是 secure copy的縮寫, scp是Linux系統下基於ssh登陸進行安全的遠端檔案拷貝命令。Linux的scp命令可以在Linux伺服器之間複製檔案和目錄。 使用語法:scp  [引數] [源路徑] @IP:/目標路徑 scp 引數如下: -1: 強制scp命令使用協

Linux編譯器搜尋標頭檔案路徑

作業系統: Linux localhost.localdomain 3.10.0-862.14.4.el7.x86_64 #1 SMP Wed Sep 26 15:12:11 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux 1.

Linux解壓 .tar.xz 檔案

就把這個檔案理解成兩層壓縮,解兩次。第二步就是直接解壓  .tar檔案的命令  xz -d    ***.tar.xz tar -xvf    ***.tar 或者直接一條命令,我一直用的是這個: tar

Linux用rm刪除的檔案的恢復方法

對於rm,很多人都有慘痛的教訓。我也遇到一次,一下午寫的程式就被rm掉了,幸好只是一個檔案,第二天很快又重新寫了一遍。但是很多人可能就不像我這麼幸運了。本文收集了一些在Linux下恢復rm刪除的檔案的方法,給大家作為參考。   首先,最好的方法是避免這個問題,以下是幾點建議

Linuxtar.xz結尾的檔案的解壓方法

今天嘗試編譯核心,下載到了一份tar.xz結尾的壓縮檔案,網上解決方法比較少,不過還是找到了,如下: $xz -d ***.tar.xz $tar -xvf  ***.tar       可以看到這個壓縮包也是打包後再壓縮,外面是xz壓縮方式,裡層是tar打包方式。

linux訪問並寫windows端共享資料夾

Windows端(win8.1): 右鍵點選資料夾-->共享-->特定使用者-->everyone-->新增-->許可權改為“讀取/寫入”-->點選共享 linux端(ubuntu16.04): 簡介:Windows共享資料夾使用的協議是SMB/CIFS。因

linux部署專案,下載檔案時,中文檔名亂碼問題

本人在linux伺服器的tomcat下部署一個war包專案,但是裡面建立中文檔名檔案一直亂碼,經過多重測試後找到解決方案: 需要在Tomcat啟動的時候強制設定LC_ALL 環境變量 =zh_CN.UTF­8,同時設定上­Dfile.encoding=UTF­8,如下圖是本人使用守護程序啟動to

Java實現從檔案最後一行開始

package comz; import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; public class FromEndRF

linux執行mysql的sql檔案(maridb資料庫也可以,親測可行)----遷移資料庫

linux下執行mysql的sql檔案 可以利用WinSCP工具將window系統下的sql檔案上傳至伺服器,也可使用資料庫工具(推薦Nvaicat)遠端連線操作資料庫 mysql -uroot -proot -- 登入並選擇資料庫(需要前提建立好資料庫) 進入到mys

Linuxvi編輯器編輯檔案時對於意外退出的文件的再次開啟的解決方案

1、當我們在虛擬機器裡面編輯檔案的時候,喜歡用vi編輯器,但是由於叢集的不穩定,或者自己開啟以後忘記關閉,切換到另一個介面繼續工作,當再次回來時候,已經失去了編輯的能力了。當我們再次開啟此檔案的時候就會出現如下介面:<--當時出錯忘了截圖了,只顧著解決呢,也是學習了一些

Linux遞迴遍歷檔案和資料夾

#include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<sys/stat.h> #include<string.h> #include<fcntl.h>