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;
}
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. –
Bitte poste ein [mcve]. Einige der Schlussfolgerungen, die Sie gemacht haben, sind entweder falsche oder fehlende Zusammenhänge. – kaylum
Wie ist die Datei geöffnet? Es wäre nützlich, einen vollständigen minimalen Code zu veröffentlichen. – chux