2016-10-12 6 views
0

Also schreibe ich eine Funktion, die aus einer Datei liest und die Bytes in einen Temp-Puffer legt. Schreibt es dann in den Parameterpuffer bei einem Offset.C-Funktion lesen

Ich verstehe möglicherweise lesen falsch, aber ich möchte lesen, jedes Mal, wenn die Funktion aufgerufen wird, sollte die nächste "Größe" von Bytes in der Datei gelesen werden. Aber es liest jedesmal die gleichen 1024 Bytes. Ich habe das Gefühl, das liegt am Umfang, wie repariere ich oder muss ich einen Offset setzen?

Gibt es auch eine Möglichkeit zu überprüfen, wie viele Zeichen gelesen wurden, wenn Lese EOF erreicht?

int addChunk(char* buffer, int size, int index){ 
    char buf[size + 1]; 
    int fdIn, cnt, i; 
    //int count = 0; 

    if (argcG < 2) { 
     fdIn = 0; 
    } 
    else if ((fdIn = open(sString, O_RDONLY)) < 0) { 
     fprintf(stderr, "file open: %s\n", sString); 
     exit(1); 
    } 

    cnt = read(fdIn, buf, size); 
    if(cnt == 0){ 
     buf[size] == '\0'; 
     close(fdIn); 
    } 

    // if (fdIn > 0){ 
     //?? 
    //} 


    for(int i = 0; i < ((cnt == 0)? size : cnt); i++){ 
     if(buf[i] == '\0'){ 
      break; 
     } 
     printf("%02X",buf[i]); 
    } 
    printf("\n"); 

    /* for(int i = (index * size) - 1; i < size; i++){ 
     buffer[i] = buf[j]; 
     j++; 
    } 
    */ 
    printf("Counted %d bytes \n", cnt); 
    return cnt; 
} 
+2

Jedes Mal, wenn Sie die Datei öffnen, wird der Dateizeiger zurückgesetzt. – usr2564301

+0

.. Ah - was soll 'index' anzeigen? "Die nächste Position eines' size' Blocks zum Lesen "? – usr2564301

Antwort

1

Das Problem, correctly identified by @RadLexus, ist die Datei jedes Mal, wenn addChunk nennen sind wieder zu öffnen.

Dateihandles, Dateizeiger, Dateinummern funktionieren grundsätzlich auf die gleiche Weise: Sie alle verhalten sich wie Cursor in einem Editor. Wenn Sie eine Datei zum Lesen öffnen, befindet sich die Dateikennung am Anfang. Wenn Sie vom Datei-Handle lesen, bewegt sich der Cursor durch die Datei, die Ihren Platz enthält. Wenn Sie das Dateihandle schließen, wird der Cursor verworfen. Wenn Sie es erneut öffnen, beginnt es erneut am Anfang der Datei.

Da Sie die Datei jedes Mal erneut öffnen, wenn Sie addChunk aufrufen, lesen Sie erneut vom Anfang der Datei aus. Ihre Verwendung der globalen Variablen sString sollte Ihnen den Tipp geben, dass etwas nicht stimmt. Globale sind fast immer ein Zeichen für eine schlecht entworfene Funktion.

Öffnen Sie stattdessen die Datei außerhalb von addChunk und geben Sie den Dateizugriffspunkt ein. Dadurch wird das Problem des erneuten Öffnens behoben und addChunk kann in anderen Dateien verwendet werden, ohne dass eine globale Variable geändert werden muss und möglicherweise anderer Code durcheinander gebracht wird.

#include <errno.h> 
#include <string.h> 

int fd = open(sString, O_RDONLY); 
if(fd < 0) { 
    fprintf(stderr, "Can't open '%s' for reading: %s\n", sString, strerror(errno)); 
    exit(1); 
} 

/* Read two chunks into buffer */ 
addChunk(fdIn, buffer, size); 
addChunk(fdIn, buffer, size); 

close(fd); 
Verwandte Themen