Frage

Ich versuche, eine Datei in einen Puffer in Blöcken der Größe BLOCK_SIZE (derzeit gleich 1000 unsigned chars) zu lesen. Mein Code findet zunächst die Anzahl der Blöcke wird es haben zu lesen, um die gesamte Datei (in der Regel 2-4) zu lesen, durchläuft dann ein for-Schleife, die Datei zu lesen (ignorieren Sie den „+17+filenamesize“ stuff, dass alle für später benötigt wird, im Programm.

Allerdings nur auf das erste Mal, wenn j=1, ist es tatsächlich Daten in die buf gestellt hat. In anderen Fällen, wenn j != 1, strlen(buf) kehrt 0 .

Ich denke, das Problem ist entweder mit der Verwendung von fseek() auf den zweiten Teil einer Datei zu suchen, bevor sie oder eine Speicherzuweisung Ausgabe zu lesen.

Jede Hilfe ist klar, wäre es für das Erhalten der 1000-1999 th Zeichen der Datei in das buf Array zu lesen.

Beigefügt ist der relevante Teil des Codes:

unsigned char *buf;
source = fopen(localpath,"r");
temp = filesize / BLOCK_SIZE + 1;

for (j=1; j <= temp; j++) {
  if (j == 1) {
     buf = (unsigned char *) malloc((sizeof(unsigned char)) * (BLOCK_SIZE + 17 + filenamesize));
     fread(buf+17+filenamesize, sizeof(unsigned char), BLOCK_SIZE, source);
   } else if (j == temp) {
     buf = (unsigned char *) malloc((sizeof(unsigned char)) * (filesize + 5 - BLOCK_SIZE*(j-1)));
     fseek(source, BLOCK_SIZE*(j-1), SEEK_SET); // off by one warning
     fread(buf+5, sizeof(unsigned char), filesize - BLOCK_SIZE*(j-1), source);
   } else {
     buf = (unsigned char *) malloc((sizeof(unsigned char)) * (5+BLOCK_SIZE*(j-1)));
     fseek(source, BLOCK_SIZE*(j-1), SEEK_SET); // off by one warning
     fread(buf+5, sizeof(unsigned char), BLOCK_SIZE, source);
   }
   // do stuff with buf here

   buf = "";
   free(buf);
}
War es hilfreich?

Lösung

Ich würde empfehlen, die Ergebnisse der fseek und fread . Insbesondere stellen Sie sicher, fseek zurückkehrt 0 -. Wenn es nicht ist, kann dies das gesamte Problem sein

Sofern fseek gelingt, fread sollten Sie die Gesamtzahl der gelesenen Bytes sagen.

Auch ist Strlen nicht unbedingt eine gültige Sache zu verwenden, da es geht davon aus, dass dies eine Null-String beendet ist. Wenn das erste Zeichen, das Sie lesen ein 0 Byte ist, kehrt Strlen 0. Sie dies nicht als null-terminierten String Behandlung (Sie nicht genug Platz für teh Nullabschluss Zuteilung - genau das, was gebraucht wird Ihre Binärdaten zu passen) , so strlen ist wahrscheinlich ungeeignet.

Andere Tipps

Die Linie buf = ""; sieht aus wie ein Bug zu mir. Dadurch wird der Zeiger buf auf eine konstante Zeichenfolge festgelegt, die Sie auch in der nächsten Zeile free() versuchen. Ich möchte nur diese Zeile überspringen.

Sie scheinen auch in den Puffer mit einigen Offsets zu lesen. dh 5 in den beiden späteren Fällen. Der erste Teil im Puffer wird dann nicht definiert sein, Manpage malloc sehen. So ein strlen(buf) fühlt sich für mich nicht definiert.

Warum verwenden Sie fseek überhaupt? Die ganze Vorstellung von „erster Prüfung, wie groß die Datei wie oft zu bestimmen, um einen Block zu lesen“ ist grundsätzlich fehlerhaft. Sie sollten nur Daten lesen, bis es keine Daten mehr übrig ist, zum Beispiel:

while( BLOCK_SIZE == ( read_count = fread( buf, sizeof *buf, count, source ))
    do_stuff_with_buf( buf, read_count );

if( ferror( source ))
    /* Handle error */;

(In diesem Beispiel wird nie nennen do_stuff_with_buf () auf einer kurze Lese, aber das ist eine triviale Änderung.)

srtlen gibt die Länge einer Zeichenkette (Anzahl von Bytes vor dem ersten Byte 0). Wenn buf [0] = 0 ist das Ergebnis 0. Verwenden Sie den Rückgabewert des fread, um zu bestimmen, wie viele Bytes tatsächlich gelesen werden.

Sie haben auch Speicherleck. Sie malloc in jeder Schleifeniterationslatenzzeit aber nur frei, wenn am Ende.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top