3 回答

TA貢獻(xiàn)1868條經(jīng)驗(yàn) 獲得超4個(gè)贊
性能可能有差異,也可能沒(méi)有差異。語(yǔ)義上有所不同。
fread(a, 1, 1000, stdin);
嘗試讀取1000個(gè)數(shù)據(jù)元素,每個(gè)元素長(zhǎng)1個(gè)字節(jié)。
fread(a, 1000, 1, stdin);
嘗試讀取1個(gè)1000字節(jié)長(zhǎng)的數(shù)據(jù)元素。
它們不同,因?yàn)閒read()返回的是它能夠讀取的數(shù)據(jù)元素的數(shù)量,而不是字節(jié)的數(shù)量。如果在讀取完整的1000個(gè)字節(jié)之前到達(dá)文件末尾(或錯(cuò)誤狀態(tài)),則第一個(gè)版本必須確切指出讀取的字節(jié)數(shù);第二個(gè)只是失敗并返回0。
實(shí)際上,它可能只是調(diào)用一個(gè)較低級(jí)別的函數(shù),該函數(shù)嘗試讀取1000個(gè)字節(jié)并指示實(shí)際讀取了多少個(gè)字節(jié)。對(duì)于較大的讀取,它可能會(huì)發(fā)出多個(gè)較低級(jí)別的調(diào)用。要返回的值的計(jì)算fread()方法不同,但是計(jì)算費(fèi)用微不足道。
如果實(shí)現(xiàn)能夠在嘗試讀取數(shù)據(jù)之前告訴您沒(méi)有足夠的數(shù)據(jù)可讀取,則可能會(huì)有所不同。例如,如果您正在讀取900字節(jié)的文件,則第一個(gè)版本將讀取所有900字節(jié)并返回900,而第二個(gè)版本可能不會(huì)費(fèi)心地讀取任何內(nèi)容。在這兩種情況下,文件位置指示符都會(huì)成功讀取成功的字符數(shù),即900。
但是通常,您可能應(yīng)該根據(jù)需要的信息來(lái)選擇如何調(diào)用它。如果部分讀取并不比完全不讀取任何數(shù)據(jù)更好,則讀取一個(gè)數(shù)據(jù)元素。如果部分讀取很有用,則以較小的塊讀取。

TA貢獻(xiàn)1712條經(jīng)驗(yàn) 獲得超3個(gè)贊
根據(jù)規(guī)范,兩者的實(shí)現(xiàn)方式可能會(huì)有所不同。
如果您的文件少于1000個(gè)字節(jié),fread(a, 1, 1000, stdin)(讀取1000個(gè)元素,每個(gè)元素1個(gè)字節(jié))仍將復(fù)制所有字節(jié),直到EOF。另一方面,未指定fread(a, 1000, 1, stdin)存儲(chǔ)(讀取1個(gè)1000字節(jié)元素)的結(jié)果a,因?yàn)闆](méi)有足夠的數(shù)據(jù)來(lái)完成對(duì)“第一個(gè)”(也是唯一的)1000字節(jié)元素的讀取。
當(dāng)然,某些實(shí)現(xiàn)可能仍會(huì)根據(jù)需要將“ partial”元素復(fù)制到任意多個(gè)字節(jié)中。
- 3 回答
- 0 關(guān)注
- 535 瀏覽
添加回答
舉報(bào)