2010-02-15 47 views
0

我想通過這樣來讀取文件中的最後50個字符:與FSEEK讀取文件的最後50個字符()

FILE* fptIn; 
char sLine[51]; 
if ((fptIn = fopen("input.txt", "rb")) == NULL) { 
    printf("Coudln't access input.txt.\n"); 
    exit(0); 
} 
if (fseek(fptIn, 50, SEEK_END) != 0) { 
    perror("Failed"); 
    fclose(fptIn); 
    exit(0); 
} 
fgets(sLine, 50, fptIn); 
printf("%s", sLine); 

這並不返回任何遠程有道理。爲什麼?

回答

11

將50改爲-50。另請注意,這隻適用於ASCII等固定長度的字符編碼。從UTF-8這樣的東西來看,從頭到尾找到第50個字符都是微不足道的。

+0

+1爲UTF-8預警 –

1

嘗試將偏移設置爲-50。

1

另外的偏移下面的事情符號可能會製造麻煩:

一個換行符使得與fgets停止閱讀,但它被認爲是一種有效的字符,因此它是包含複製到str中的字符串中。

使用ferror或feof來檢查是否發生錯誤或已達到文件結束。

See also

0

FSEEK(fptIn,50,SEEK_END)

設置在該文件的末尾的流指針,然後試圖定位光標50個字節其前方。請記住,對於二進制流:

對於二進制流,新的位置時,從文件的開頭字符測量,是通過將偏移量由whence..The指定的位置得到指定 位置是文件的開始位置,如果是SEEK_SET,則文件的當前值爲 位置指示符(如果是SEEK_CUR),或文件結束位置(如果是SEEK_END)。 二進制流不需要 有意義地支持fseek調用,其值爲SEEK_END。

這個調用應該失敗。下一個撥打fgets的電話會調用UB。嘗試-50作爲偏移,也當且僅當調用成功嘗試將其讀入您的緩衝區

注:重點煤礦

相關問題