2009-08-13 55 views
3

有什麼辦法從文本文件中刪除最後10個字符?從文本文件中刪除最後10個字符

感謝

+3

有什麼文件編碼? – 2009-08-13 09:55:09

+0

如何處理不只一種文件編碼的解決方案?我肯定會贊成這樣的答案! :-) – 2009-08-13 11:12:12

+1

@Alceu。在純粹的C90?由setlocale()開始,打開一個臨時文件,讀取緩衝區。使用mblen()知道哪些字節是一個字符的一部分。將字符複製到除最後十個之外的臨時文件。重新填充緩衝區並重復,不要忘記輸出前一個緩衝區的最後十個字符。然後將臨時文件的內容複製到原始文件的內容。可能但很乏味。在C95中,只需使用getwc()和putwc()來獲得更明顯的解決方案。 – AProgrammer 2009-08-13 12:40:54

回答

9

有關POSIX平臺,你可以使用這樣的單字節編碼(處理省略錯誤):

FILE *file = fopen("filename", "a"); 
fseek(file, -10, SEEK_END); 
ftruncate(fileno(file), ftell(file)); // POSIX function 

它是不會與可變長度的字符編碼工作,如UTF-8和UTF-16。

+0

ftruncate()是否可移植? – 2009-08-13 10:14:16

+0

這隻適用於文件爲ascii的情況。 – Toad 2009-08-13 10:14:31

+0

@Vijay ftruncate()是POSIX函數,因此它可以移植到POSIX平臺。 – qrdl 2009-08-13 10:25:20

3

的東西,會在Windows下工作,以及你可以做這樣的事情:

FILE* pFileIn = fopen("filenameIn", "rb"); 
FILE* pFileOut = fopen("filenameOut", "w+b"); 

fseek(pFileIn, -10, SEEK_END); 
long length = ftell(pFile); 

long blockSize = 16384; 
void* pBlock = malloc(blockSize); 
long dataLeft = length; 
while(dataLeft > 0) 
{ 
    long toCopy = (dataLeft > blockSize) ? blockSize : dataLeft; 

    fread(pBlock, toCopy, 1, pFileIn); 
    fwrite(pBlock, toCopy, 1, pFileOut); 

    dataLef  -= toCopy; 
} 

free(pBlock); 

fclose(pFileIn); 
fclose(pFileOut); 
相關問題