ifstream::read
只是將n
字節讀入緩衝區,但不會在緩衝區末尾附加,對不對?然後當我使用緩衝區時,它如何知道緩衝區的結束?ifstream :: read doesnot append' 0'
我應該在緩衝區的末尾手動追加一個嗎?
ifstream::read
只是將n
字節讀入緩衝區,但不會在緩衝區末尾附加,對不對?然後當我使用緩衝區時,它如何知道緩衝區的結束?ifstream :: read doesnot append' 0'
我應該在緩衝區的末尾手動追加一個嗎?
是的,你是正確的,你需要手動將它附加到緩衝區的末尾:buffer[length] = '\0';
如果你想要一個空終止符。 當您撥打write
時,您還可以指定輸出的長度:std::cout.write(buffer, length);
,它將只輸出length
數據數量,告訴它何時停止要求您不要使用空終止符。 雖然我會研究std::getline
和std::string
以獲得更健壯的方法。
如果你正在讀成std::string
說,與std::getline
,然後進行串的長度 - std::string
不受'\0'
終止C風格char*
字符串。如果你讀入std :: string,然後使用string.c_str(),那麼這是null終止。您可以將其用於C風格的字符串。
如果您正在閱讀char*
,則必須提供一個長度 - 即多少個字節的讀數獨立於任何。在這種情況下,您應該在緩衝區的末尾手動追加'\ 0'。
'std :: string'保證在C++ 11,IIRC中以null結尾。 – Xeo 2012-07-26 03:28:28
ifstream
用於讀取文件,二進制或文本。當用read
處理二進制文件時,不能確定零字節的來源(來自文件本身或附加read
),因此讀取時不會將零附加到目標緩衝區。
如果你在一個文本文件的工作,那麼你可以使用std::getline,並收到std::string
:
istream& getline (istream& is, string& str);
你可以把任何你想在緩衝區的末尾,只要有空間爲了它。 istream::read
不會告訴你它讀取了多少字節;它要麼讀取您要求的所有內容,要麼將流的狀態更改爲fail/eof。
如果您想處理可能比預期的字節少的情況,請使用istream::readsome
,它將返回提取的字節數。
如提到的其他答案,如果您正在處理字符串,請使用讀取字符串的函數,如std::getline
或>>
提取器。 istream::read
用於二進制數據 - 在這種情況下,std::streambuf
通常更方便使用。
您可以撥打ifstream::gcount()
來確定在read()
操作中讀取的字符數。
他爲什麼需要這樣做? 'read'方法用於原始數據,對'\ 0'沒有特殊解釋。 – DanielKO 2012-07-26 22:10:44
@DanielKO:我剛剛意識到你正在討論在將緩衝區傳遞給'read'之前追加空終止符。這個問題在調用'read'之後專門討論瞭如何使用緩衝區。 – 2012-07-26 23:05:41
不,我說的是在讀取二進制數據時不需要任何終止符。如果你在談論字符串,那麼'istream :: read'不是你應該使用的函數。 – DanielKO 2012-07-28 00:07:45