2012-07-26 64 views
4

ifstream::read只是將n字節讀入緩衝區,但不會在緩衝區末尾附加,對不對?然後當我使用緩衝區時,它如何知道緩衝區的結束?ifstream :: read doesnot append' 0'

我應該在緩衝區的末尾手動追加一個嗎?

回答

1

是的,你是正確的,你需要手動將它附加到緩衝區的末尾:buffer[length] = '\0';如果你想要一個空終止符。 當您撥打write時,您還可以指定輸出的長度:std::cout.write(buffer, length);,它將只輸出length數據數量,告訴它何時停止要求您不要使用空終止符。 雖然我會研究std::getlinestd::string以獲得更健壯的方法。

+0

他爲什麼需要這樣做? 'read'方法用於原始數據,對'\ 0'沒有特殊解釋。 – DanielKO 2012-07-26 22:10:44

+0

@DanielKO:我剛剛意識到你正在討論在將緩衝區傳遞給'read'之前追加空終止符。這個問題在調用'read'之後專門討論瞭如何使用緩衝區。 – 2012-07-26 23:05:41

+0

不,我說的是在讀取二進制數據時不需要任何終止符。如果你在談論字符串,那麼'istream :: read'不是你應該使用的函數。 – DanielKO 2012-07-28 00:07:45

1

如果你正在讀成std::string說,與std::getline,然後進行串的長度 - std::string不受'\0'終止C風格char*字符串。如果你讀入std :: string,然後使用string.c_str(),那麼這是null終止。您可以將其用於C風格的字符串。

如果您正在閱讀char*,則必須提供一個長度 - 即多少個字節的讀數獨立於任何。在這種情況下,您應該在緩衝區的末尾手動追加'\ 0'。

+2

'std :: string'保證在C++ 11,IIRC中以null結尾。 – Xeo 2012-07-26 03:28:28

3

ifstream用於讀取文件,二進制或文本。當用read處理二進制文件時,不能確定零字節的來源(來自文件本身或附加read),因此讀取時不會將零附加到目標緩衝區。

如果你在一個文本文件的工作,那麼你可以使用std::getline,並收到std::string

istream& getline (istream& is, string& str); 
+0

upvoted,但getline只是讓我一條線,對吧? – Alcott 2012-07-26 09:51:49

+0

@Alcott,是的,它不會讀過換行符 – perreal 2012-07-26 09:57:40

0

你可以把任何你想在緩衝區的末尾,只要有空間爲了它。 istream::read不會告訴你它讀取了多少字節;它要麼讀取您要求的所有內容,要麼將流的狀態更改爲fail/eof。

如果您想處理可能比預期的字節少的情況,請使用istream::readsome,它將返回提取的字節數。

如提到的其他答案,如果您正在處理字符串,請使用讀取字符串的函數,如std::getline>>提取器。 istream::read用於二進制數據 - 在這種情況下,std::streambuf通常更方便使用。

0

您可以撥打ifstream::gcount()來確定在read()操作中讀取的字符數。