2013-01-03 8 views
5

Bu Kolayca yanıtlanabilir umut basit türden bir soru, dosya akışı okuma ve yazma yapmak olduğu operasyonlar boyunca işaretçiyi hareket okuma/yazma fstream yapar? CArray [] olan bir yöntem kullanılır bağımsız olarak aynı içeriği ihtiva etmez Diğer bir deyişlehareket dosya işaretçisi

dataFile.seekg(cpos,ios::beg);  
cpos=10000; 
for (i=0;i<20;i++) { 
    dataFile.read(carray[i],1); 
} 

(I göremez: özdeş (mantıksal olarak) için

cpos=10000; 
for (i=0;i<20;i++) { 
    dataFile.seekg(cpos+i,ios::beg); 
    dataFile.read(carray[i],1); 
} 

mi: Bir örnek olarak İlk yöntemin verimli olması için doğru cevabın evet olduğunu umuyorum). Öyleyse, yazım işlemleriyle aynı davranış sergileniyor mu?

cevap

5

Evet, işte bu işler yoldur. Yine de örneklerin tam olarak aynı değil. İlk örnek ikinci bir başlangıç ​​pozisyonunu ayarlamak için döngü dışında aramaya ihtiyacı vb sonra 10001, ardından 10002, 10000 den okur. okuma ile

cpos=10000; 
dataFile.seekg(cpos,ios::beg); 
for (i=0;i<20;i++) { 
    dataFile.read(carray[i],1); 
} 
+0

Üzgünüm, biliyorum ki - sadece döngü içinde olmayanı arıyordum. Onay için teşekkürler. – mlewis54

1

Evet, dosya işaretçisi otomatik olarak hareket eder ve yazma işlemleri:% 100 eşdeğeri olmak için, ikinci örnek gibi bakmak olması gerekir. ... ve arayan değil performansı çok geliştirir. Ayrıca, file.read(ptr, 20) kullanılarak 20 kez file.read(ptr + i, 1) kullanmaktan daha çok hızlıdır. Aynı semantiği elde etmek için tek bir aramayı kullanarak uygun yere gitmeniz gerekir.

Bir dosya akışında arama yapmak, akışı hem okuma hem de yazma devam edebildiği bir duruma ayarlar: Okuma/yazma modunda (std::ios_base::in | std::ios_base::out) açılan bir akış için okuma ve yazma arasında geçiş yapmak için bir aramak. Her böylece, sadece okur veya karakterler dizisi yazıyor eğer akışı yapmak gerekmez komik bir şekilde mevcut tampon ayarladı, bkz. Ayrıca, her aramayı yazarken en azından kod dönüştürme için başlangıç ​​durumuna girmek için karakter yazmanın gerekli olup olmadığını kontrol eder.