簡體   English   中英

如果已經到達null終止符,write()會寫什么?

[英]What does write() write if null terminator is already reached?

對於write(fd[1], string, size) - 如果string短於size會發生什么?

我查看了手冊頁,但沒有明確說明這種情況。 我知道,對於read ,它只是停在那里並讀取任何string ,但它肯定不是write的情況。 那么寫什么呢? 返回值仍然是size所以它是否附加空終止符? 為什么它不像read那樣停止。

當您調用write() ,系統會假定您正在將通用數據寫入某個文件 - 它並不關心您是否有字符串。 一個以null結尾的字符串被視為一堆非零字節,后跟一個零字節 - 系統將一直寫出,直到寫入size字節為止。

因此,指定比字符串長的size可能是危險的。 系統可能正在讀取超出文件字符串末尾的數據,可能是垃圾數據。

write將從string開始寫入size字節的數據。 如果將字符串定義為比大小短的數組,則它將具有未定義的行為。 但在你之前的問題中, char *line = "apple"; 包含6個字符(即a,p,p,l,e和空字符)。

所以最好將size的值設置為正確的值

write(int fildes,const void * buf,size_t nbyte)不寫空終止字符串。 它寫入緩沖區的內容。 如果緩沖區中有任何空字符,它們也將被寫入。

read(int fildes,void * buf,size_t nbyte)也不關注空字符。 它將多個字節讀入給定緩沖區,最大為nbyte。 它不會添加任何空終止字節。

這些是低級例程,專為讀取和寫入任意數據而設計。

write調用輸出給定大小的緩沖區。 它不會嘗試解釋緩沖區中的數據。 也就是說,你給它一個指向內存位置和要寫入的字節數(長度)的指針,只要這些內存位置存在於程序數據的合法部分,它就會將這些字節復制到輸出文件中描述。

與字符串操作例程的寫入和讀取不同,忽略空字節,即值為零的字節。 read確實注意EOF字符,並且在某些設備上,只讀取當時可用的數據量,可能返回的數據少於請求的數據,但是它們在原始字節上操作而不將它們解釋為“字符串”。

如果您嘗試寫入的數據多於緩沖區所包含的數據,則根據內存的位置,它可能會也可能不起作用。 最好的行為是未定義的。 在最壞的情況下,你會遇到一個段錯誤,你的程序會崩潰。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM