2013-04-16 12 views
5

Sto provando a leggere i file che vengono scritti contemporaneamente sul disco. Ho bisogno di leggere pezzi di dimensioni specifiche. Se la dimensione letta è inferiore alla dimensione specifica, mi piacerebbe non leggere il file (qualcosa di simile a ciò che fa ungetc, invece di un carattere []) e riprovare. Aggiungere i byte già letti non è un'opzione per me.non letto un file in C++

Com'è possibile?

ho provato salvare la posizione corrente attraverso:

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

e poi la lettura del file e mettendo il puntatore nella sua posizione prima del-fread.

numberOfBytes = fread(buff, sizeof(unsigned char), desiredSize, fd) 
if (numberByBytes < desiredSize) { 
    fsetpos (fd, &position); 
} 

Ma non sembra funzionare.

+3

C _or_ C++? Sceglierne uno. –

+0

@EtiennedeMartel, ci sono momenti in cui le differenze sono importanti - è questa una di queste? Non sembra per me. –

+0

@MarkRansom, non importa se la differenza di * domanda * è importante, ma è importante dare risposte. ** Altamente ** è importante quando dare risposte. – Griwes

risposta

3

Sostituendo i miei suggerimenti precedenti con il codice appena controllato (Ubuntu 12.04 LTS, 32 bit). GCC è 4.7 ma sono abbastanza sicuro che questa è una soluzione standard al 100%.

#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; 
} 

stavo aggiungendo testo in un file da un'altra console e sì, è stato letto un progresso del 5 caratteri blocchi in conformità a quello che stavo aggiungendo.

0

fseek sembra perfetto per questo:

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

Si noti inoltre che un descrittore di file è quello che open rendimenti, non fopen.

Problemi correlati