2013-04-16 17 views
5

Ich versuche, Dateien zu lesen, die gleichzeitig auf die Festplatte geschrieben werden. Ich muss Stücke bestimmter Größe lesen. Wenn die gelesene Größe kleiner ist als die spezifische Größe, möchte ich die Datei lesen (etwas wie ungezählt, statt eines char []) und es erneut versuchen. Das Anhängen an die bereits gelesenen Bytes ist für mich keine Option.ungelesene Datei in C++

Wie ist das möglich?

Ich habe versucht, die aktuelle Position durch Speichern:

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

und dann liest die Datei und setzt den Zeiger zurück in seine vor-fread Position.

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

Aber es scheint nicht zu funktionieren.

+3

C _or_ C++? Wähle eins. –

+0

@EtiennedeMartel, es gibt Zeiten, in denen die Unterschiede wichtig sind - ist das einer von ihnen? Sieht für mich nicht so aus. –

+0

@MarkRansom, es spielt keine Rolle, ob der Unterschied in * Frage * wichtig ist - aber es ist wichtig, wenn Antworten gegeben werden. ** Sehr wichtig **, wenn Sie Antworten geben. – Griwes

Antwort

3

Ersetzen meiner bisherigen Vorschläge mit Code ich gerade überprüft (Ubuntu 12.04 LTS, 32bit). GCC ist 4,7, aber ich bin mir ziemlich sicher, dass dies eine 100% Standardlösung ist.

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

Ich war das Hinzufügen von Text aus einer anderen Konsole Datei und ja, lesen Sie wurde von 5 Zeichen Blöcke entsprechend voran zu, was ich hinzufügen.

0

fseek scheint perfekt dafür:

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

Beachten Sie auch, dass ein Dateideskriptor, was open zurückkehrt, nicht fopen.