2013-10-16 17 views
5

Parametre büyüklüğünün hangi sırayla ilgili olduğuna dair kuşkum var ve fread/fwrite için kullanılacak. Eğer fp dosyasından 8kb veri okumak istersem, hangisi daha verimli?fread/fwrite boyutu ve sayımı

fread(data,1,8192,fp) 
fread(data,8192,1,fp) 

Ayrıca endişelenmem gereken endiannes sorunları var mı?

cevap

11

Tam olarak eşdeğerdirler. Endianness'a gelince, okuduğun şeye bağlı. Normalde, yazdıkları formata göre "unformat" yapmak zorunda kalacağınız bir bayt tamponu olacaktır. Ve bayt olduğu için, endenlik hiçbir rol oynamaz.

DÜZENLEME: simonc belirttiği gibi

(o% 100 doğru alamadım çünkü ve daha sonra silinen --- fakat amacı geçerli olduğunu): dönüş değeri açısından (bir fark var Fonksiyonun işe yarayıp yaramadığını bilmek için kullanmanız gereken). fread(buffer, 8192, 1, fp), yalnızca 8192 bayt okunduğunda 0 veya 1 ve 1 döndürecektir. Ek olarak, Posix, arabellek içeriğinin kısmen okunan nesneler için belirtilmediğini söyler. Pratikte, tampon okunabilecek kadar çok bayt ile doldurulacaktı, ama kaç tane olduğunu bilmediğinizden, bu sizi fazla satın almıyor. Özet olarak, her zaman fread(buffer, 1, 8192, fp); kullanmalısınız (bu işlevi herhangi bir şey için değil, ancak bir bayt tamponu olarak kullanmanın bir anlamı yoktur).

+0

Eh, bu bayt olduğu için, açıkça endianness bir rol oynayacaktır. Örneğin, bu 8 kb'lik verileri, örneğin 'int' üyeleri olan bir yapıya okumaya çalıştığını düşünün. Char string [] = fread (data, 8192,1, fp); ' – fvdalcin

+3

@fvdalcin Okumakta olan bir şeyi yapmaya çalışıyor. Baytların endike olmaları. Onları okuduğunda, bunları dosya formatının özelliklerine göre yorumlamak zorundadır. Bu, normalde, aynı zamanda, endianness olarak değerlendirilmeden de yapılmalıdır. –

+0

@fvdalcin Ve evet, bu işlevlerin tek makul kullanımı "imzasız char buffer" [8192]; yaymak (tampon, 8192, 1, fp); '. Daha sonra, belirtilen dosya formatına göre tamponu yorumlamanız gerekir. –

2

Tam olarak eşdeğer değiller. Yanlış tasarlanmıştı.

fread() yanlış tasarlanmıştı. Tasarımı, dosyanın sonunda, belirttiğiniz boyuttaki birimlerdeki dönüş değeriyle ifade edilemeyen kısmi bir okuma olasılığını göz ardı eder.

Gerçekten yalnızca fread() numaralı yordamı kullanmalısınız; buradaki boyut 1'dir ve uzunluk, beklediğiniz bayt sayısıdır. Bu durumla düzgün başa çıkabilmenin tek yolu budur. char dışındaki türlerde, sizeof char boyutunda ve n*sizeof T uzunluğunun sağlandığı anlamına gelen n, T s sayısıdır.