2017-01-10 2 views
-1

Ich arbeite an einer Datendatei, die eine feste Anzahl von Zeichen enthält, gefolgt von einem Doppelpunkt und einer Zahl. Alle der ersten vier Zeichen können von allen Nullen bis zu allen (Char) 255s reichen.C Lesen einer Datei mit Null darin

Wenn ich jedoch versuche, es zu lesen, habe ich Probleme beim Bestimmen des EOF.

Wenn ich read(2) POSIX verwenden wie so:

ssize_t letters_read = read(fd, buf, 4); 

Dann letters_read auf 0. Der Mann Seite gesetzt ist, sagt, dass bedeutet, dass ich ein EOF erreicht haben; Dies ist jedoch einfach nicht wahr.

Wenn ich fread(3) in ähnlicher Weise verwende, dann bekomme ich immer noch Null als Rückgabewert. Sogar wenn ich die Datei an feof(3) sende, heißt es, dass ich am Ende der Datei bin.

Jetzt, wenn ich nur die Rückgabewerte ignoriere, kann ich die Datei weiter lesen und weitere Ergebnisse erhalten.

Wie könnte ich alle vier Nullen lesen und trotzdem wissen, wann ich ein eof erreicht habe?

Ein kleiner Auszug der Datei wie folgt aussieht:

 
4 
(null)(null)(null)(null):4 
(null)(null)(null)(null):40 
(null)(null)(null)(null):402 
Af*8:3004 

UPDATE hier
Wie pro Antrag, ist, wie ich über das Sammeln von Daten werde:

#include <sys/types.h> 
#include <sys/stat.h> 
#include <unistd.h> 
#include <fcntl.h> 
#include <stdio.h> 
#include <stdlib.h> 

void process_characters(char *data); 


int main(int argc, char *argv[]) 
{ 
    char *input_file = argv[1]; 

    int opt = 0; 

    int input_fd = open(input_file, O_RDONLY); 

    FILE *temp_fd = fopen(input_file, "r"); 

    unsigned long character_size = 0; 

    fscanf(temp_fd, "%l", character_size); 


    char data[character_size]; 

    //gobble up the first line 
    do 
    { 
    read(input_fd, data, 1); 
    printf("%i\n", data[0]); 
    } while(data[0] != '\n'); 

    size_t characters_read = 0; 
    characters_read = read(input_fd, data, character_size); 
    //while(feof(temp_fd) != 0) 

    while(characters_read != 0) 
    { 

    //fread(data, sizeof(char), character_size, temp_fd); 
    process_characters(data); 
    ///gobble up the garbage 
    do 
    { 
     read(input_fd, data, 1); 
     printf("%i\n", data[0]); 
    }while(data[0] != 10); 

    characters_read = read(input_fd, data, character_size); 
    } 

    fclose(temp_fd); 
    close(input_fd); 
    return EXIT_SUCCESS; 
} 
+2

Wenn Sie beim Lesen Null erhalten, sind keine Daten mehr zu lesen. Wie hast du die Datei geöffnet? Es kann sein, dass Sie die Datei gezappt haben, oder sie wird am Ende positioniert. Bitte stelle MCVE ([MCVE]) bereit. –

+0

Bitte poste ein [mcve]. Einige der Schlussfolgerungen, die Sie gemacht haben, sind entweder falsche oder fehlende Zusammenhänge. – kaylum

+0

Wie ist die Datei geöffnet? Es wäre nützlich, einen vollständigen minimalen Code zu veröffentlichen. – chux

Antwort

1

Dieser Code :

unsigned long character_size = 0; 

    fscanf(temp_fd, "%l", character_size); 

... hat ein ungültiges Format angegeben und muss die Variablenadresse und nicht ihren Wert angeben. "%l" gibt keinen zu lesenden Typ an. Vielleicht möchten Sie "%lu", die für eine vorzeichenlose Long Integer ist, wie character_size definiert ist. character_size sollte &character_size sein.

Allerdings gibt es keinen solchen (dezimalen) Wert am Anfang der von Ihnen bereitgestellten Beispieldatei, daher ist es unklar, was diese Zeile wirklich machen soll.

(Sie behauptet, dass 0 wie folgt zurückkehrt gelesen werden:

ssize_t letters_read = read(fd, buf, 4); 

Allerdings gibt es keine solche Zeile im Code).

+0

Wenn ich es in% lu ändere, erhalte ich einen segfault. – SailorCire

+1

'fscanf (temp_fd,"% ld ", & Zeichengröße);' Es benötigt die Adresse der Variablen, nicht den Inhalt davon als Parameter – infixed

+0

@infixed in der Tat, das habe ich verpasst. Danke, bearbeitet. – davmac