2016-03-29 22 views
-1

tarafından eklenen bir dosyadan nasıl okumanız için bir dosyaya yazıyor. Oluşturduğum yeni bir süreç bu dosyayı açacak ve ideal olarak bu değişiklikleri okuyacak ve işleyecek.sürekli olarak başka bir program C++ linux

şimdiye kadar bu i Ben sürekli yapmak farklı bir işlevde

sonradan dosyayı açmak kontrolleri değişiklikleri kontrol ve belli belirsiz

benziyor onlara

işlemek için üzerine okur sınıfta

open(file); 
while(1) 
{ 
fread(buffer, 1, 16000, file); 
//do something 
} 

sorunu, boş bir dosyaya çekip açıldıktan sonra üzerine yazarak hata ayıklamayı gerçekleştirdim. DOSYA nesnesi hiçbir zaman değişiklikleri görmez.

eof'i kapatıp tekrar açmam gerekiyor mu? Değişiklikleri işe almak için en üstte?

+1

Sen ondan okumadan önce yazdıktan sonra dosyayı kapatmak zorundayız. – xinaiz

+1

@ BlackMoses: Mutlaka değil. Bu Linux, Windows değil. – Olaf

+1

EOF göstergesini temizlemek için 'file.clear()' işlevini kullanın, böylece eski EOF'u okuyabilirsiniz. – Barmar

cevap

0

dbush önerdiği Buna alternatif bir yaklaşım:

/* declare buffer, file and open file */ 
size_t rc; 
while (1) { 
    if ((rc = fread(buffer, 1, 16000, file)) == 0) { 
     if (feof(file))   { 
      clearerr(file); 
      usleep(100); 
     } else { 
      /* it's a real error, not EOF */ 
     } 
    } else { 
     /* process rc bytes in buffer */ 
    } 
} 
+0

çalışıyorum, bir clearerr yazdım ama sorun değil. Sorun şu ki, bir dosyayı bir editörde açıp (vim kullanıyorum), kaydet ve kapat, program hala hata ayıklanırken, program dosyanın değiştiğini görmez ve okunan bayt için 0 değerini döndürür. – gbux

+0

Yukarıdaki kod, dosya eklendiğinde çalışır (yani, FILE işaretçisinin geçerli konumunun ötesinde yeni veriler eklenir). Dosyayı düzenler ve kısaltırsanız, 'fread' dosya sonuna kadar okumayı dener ve değişiklikleri görmez. Eğer test çantanızda 'tail -f' çalışıyorsa, yukarıdaki kod da aynı şekilde olacaktır. – isedev

1

Dosyanızın sonuna atlamak için fseek, ardından ofsetinizi görmek için ftell kullanabilirsiniz. Son defa değiştiyse, daha fazla veri olduğunu biliyorsunuz.

int current = 0, last = 0; 

FILE *f=fopen(filename, "r"); 
if (!f) { 
    perror("can't open file"); 
    exit(1); 
} 
while (1) { 
    fseek(f, 0, SEEK_END); 
    current = ftell(f); 
    if (current != last) { 
     printf("len=%d\n",current); 
     fseek(f, current, SEEK_SET); 
     last = current; 
     fread(buffer, 1, 16000, f); 
     .... 
    } 
    usleep(100); 
} 
İlgili konular