2010-07-15 77 views
1

我想消除txt文件末尾多出的'\ n'。在c/C++中可以使用哪個函數來完成這項工作。如何消除txt文件末尾的' n'

得益於先進的

+0

究竟你的「額外」是什麼意思?一個文本文件是一系列的行,一行是零個或多個字符,後跟一個換行符。如果文件中的最後一個字符不是換行符,那麼嚴格來說它不是一個文本文件。你想從文本文件的末尾刪除多餘的空白行嗎? – 2010-07-15 21:07:31

+0

@Charles:什麼?由於最後一行不是以換行符結束,它不是「嚴格」的文本文件?換行符是行*分隔符*。這不是一段結束句子或分號來結束C++語句的時期。 – 2010-07-15 21:40:54

+0

@Mike Daniels:是的,儘管它的名字是換行符,但是不是分隔符。這是K&R公約在文本流中的使用,並且是現行的C標準,並且歷來一直是舊系統中的情況。想想基於行的編輯器,基於unix行的工具等。他們總是用換行符終止最後一行(像其他行一樣)。 – 2010-07-15 22:08:59

回答

0

一個辦法是遍歷文件的行由行使用函數getline,保存關閉該數據供以後使用。讀完每行後,寫上一行(用\n)。當沒有更多的數據可用時,請寫下沒有\n的最後一行。

交替尋求最終獲取大小,讀取某些塊大小的塊中的數據,重寫它們,直到倒數第二個字符。如果最後一個字符是\n則不要編寫它,否則請寫下它。

0

posix的做法是截斷函數。 如果使用seek或另一個OS調用獲取文件的長度,則可以使用截斷到 修剪文件長度的最後一個字符,而不用重寫整個事件。相當於

//This RESIZES the file without the need to REWRITE the whole thing: 
struct stat fileStat; 
stat("Filename", &fileStat); 
status = truncate("Filename",fileStat.st_size-1); 

Windows函數是chsize但它首先需要打開一個文件:

// Open a file 
    if(_sopen_s(&fh, "data", _O_RDWR | _O_CREAT, _SH_DENYNO, 
       _S_IREAD | _S_IWRITE) == 0) 
    { 
     if((result = _chsize(fh, _filelength(fh) -1)) == 0) 
     printf("Size successfully changed\n"); 
     else 
     printf("Problem in changing the size\n"); 
     _close(fh); 
    }