2013-04-16 37 views
5

Aynı anda diske yazılan dosyaları okumaya çalışıyorum. Belirli boyuttaki parçaları okumam gerekiyor. Okunan boyut belirli bir boyuttan küçükse, dosyanın okunmamasını isterim (ungetc'in yaptığı gibi bir şey yerine [] için bir şey yapar) ve tekrar deneyin. Zaten okunan baytlara eklemek benim için bir seçenek değil.C++ içinde bir dosya okunamıyor

Bu nasıl olabilir?

FILE *fd = fopen("test.txt","r+"); 
fpos_t position; 
fgetpos (fd, &position); 

ve sonra dosyayı okuma ve onun daha önce fread pozisyona geri işaretçi koyarak:

İçinden mevcut konumu tasarruf çalıştı.

Ama çalışmıyor gibi görünüyor.

+3

C _or_ C++? Bir tane seç. –

+0

@EtiennedeMartel, farkların oluştuğu zamanlar var - bunlardan biri mi? Bana benzemiyor. –

+0

@MarkRansom, * soru * 'daki farkın önemli olup olmadığı önemli değil - ama cevap verirken önemlidir. ** Yüksek ** cevap verirken önemlidir. – Griwes

cevap

3

Önceki önerilerimi kod kullanarak değiştirme (Yalnızca Ubuntu 12.04 LTS, 32bit). GCC 4.7'dir ama eminim ki bu% 100 standart çözümdür.

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

#define desiredSize 10 
#define desiredLimit 100 

int main() 
{ 
    FILE *fd = fopen("test.txt","r+"); 
    if (fd == NULL) 
    { 
     perror("open"); 
     exit(1); 
    } 

    int total = 0; 
    unsigned char buff[desiredSize]; 

    while (total < desiredLimit) 
    { 
     fpos_t position; 
     fgetpos (fd, &position); 

     int numberOfBytes = fread(buff, sizeof(unsigned char), desiredSize, fd); 
     printf("Read try: %d\n", numberOfBytes); 
     if (numberOfBytes < desiredSize) 
     { 
      fsetpos(fd, &position); 
      printf("Return\n"); 
      sleep(10); 
      continue; 
     } 
     total += numberOfBytes; 
     printf("Total: %d\n", total); 
    } 
    return 0; 
} 

başka konsoldan dosya metin ekleyerek ve evet, ekleme ne uygun olarak 5 karakter bloklar tarafından ilerlediğini okuyun.

0

fseek bunun için mükemmel görünüyor:

FILE *fptr = fopen("test.txt","r+"); 
numberOfBytes = fread(buff, 1, desiredSize, fptr) 
if (numberOfBytes < desiredSize) { 
    fseek(fptr, -numberOfBytes, SEEK_CUR); 
} 

Ayrıca dosya tanıtıcı olduğuna dikkat neyi open döner, değil fopen.

İlgili konular