2017-05-17 3 views
0

Ich schreibe ein Stück Code und ein Teil davon liest "Datensätze" von Datei zu n-Länge Array, n als ein Argument gegeben. Datensätze in Datei haben konstante Länge (in diesem Fall 1024) und enthalten nur numerische Zeichen, Leerzeichen und untere Buchstaben. Jeder Datensatz wird mit \ n abgeschlossen. Ich verwende folgende Struktur einen Datensatz zu halten:Lesen von Daten von Datei zu Struktur mit fread

typedef struct{ 
char rec[1024]; 
} record; 

Und-Code für n von ihnen zu extrahieren und in n-Array mit der Länge von Datensätzen speichert, wird auf diese Weise geschrieben:

record * recs=malloc(n*sizeof(record)); 
size_t read=fread(recs,sizeof(record),(size_t)n,f); 

Wenn ich Ausgang geprüft Von diesen Operationen stellt es sich heraus, dass das erste Element von Array-Recs alle Datensätze enthält, das zweite alles außer dem ersten und so weiter, anstatt eines bei jedem Element des Arrays zu behalten. Ich bin irgendwie verloren, weil ich dachte, dass es jeden Datensatz in einem anderen Array-Element speichern sollte. Wie bereits angedeutet, ich bin die Bereitstellung Code auch eine Datei und Druckelemente des Arrays zum Öffnen:

if((f=fopen(argv[2],"r"))==NULL){ 
     perror("error opening file\n"); 
     exit(1); 
    } 

for(int i=0;i<(int)read;i++){ 
     printf("record number %d\n %s\n",i,recs[i].rec); 
    } 
+0

zeigen Sie den Code, der aus den Aufzeichnungen, und auch den Code schreibt, dass 'die Datei fopen's. – dasblinkenlight

+0

@dasblinkenlight Ich habe meine Frage nach Ihren Vorschlägen bearbeitet. –

+1

Ändern Sie "r" in "rb" und sehen Sie, ob es hilft. – dasblinkenlight

Antwort

6

Das Problem ist, dass Ihre Aufzeichnungen rec keine Null-terminierte String ist.

So zeigt Drucken mit %s alle Datensätze, weil der Druck nur fortgesetzt wird, bis es einen '\0' sieht.

Stellen Sie also sicher, dass in jedem rec eine Null-Terminierung hinzugefügt wird oder verwenden Sie eine andere Druckmethode als %s.

BTW: Wenn es keine 0-Terminierung innerhalb recs gibt, haben Sie tatsächlich undefined Verhalten.

Dieses kleine Programm ahmt das Problem:

#include <stdio.h> 

struct r { 
    char c[1]; 
}; 

int main(void) { 
    int i; 
    struct r recs[4] = {{'a'}, {'b'}, {'c'}, {'\0'}}; 
             //  ^^^^^ 
             //  Just to stop printing here 
    for (i=0; i<3; i++) 
    { 
     printf("%d %s\n", i, recs[i].c); 
    } 

    return 0; 
} 

Ausgang:

0 abc 
1 bc 
2 c 
+0

Das ist wahrscheinlich der Fall, vielen Dank für Ihre Hilfe. Ich würde es für ein paar Stunden nicht selbst herausfinden. –