2017-01-10 3 views
-1

Je travaille sur un fichier de données contenant un nombre fixe de caractères suivi d'un deux-points et d'un nombre. Tous les quatre premiers caractères peuvent être quelque chose de tous les nulls à tous (char) 255s.C lire un fichier avec null

Cependant, en essayant de le lire, je vais avoir du mal à déterminer l'EOF.

Si j'utilise comme celui posix read(2) donc:

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

Ensuite letters_read est réglé sur 0. La page de manuel dit que cela signifie que je suis arrivé à un EOF; Cependant, ce n'est tout simplement pas vrai.

Si je fread(3) d'une manière similaire, je reçois toujours zéro comme une valeur de retour. Même lors de l'envoi du fichier à feof(3), il est dit que je suis à la fin du fichier.

Maintenant, si j'ignore simplement les valeurs de retour, je suis en mesure de continuer à lire le fichier et obtenir d'autres résultats.

Comment pourrais-je être capable de lire les quatre valeurs nulles et toujours être en mesure de savoir quand je suis arrivé à un EOF?

Un petit extrait du fichier ressemble à ceci:

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

MISE À JOUR
Selon la demande, voici comment je vais sur la collecte des données:

#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

Si vous obtenez zéro à partir de la lecture, il n'y a plus de données à lire. Comment avez-vous ouvert le fichier? Il se peut que vous ayez zappé le fichier ou qu'il soit positionné à la fin. S'il vous plaît fournir un MCVE ([MCVE]). –

+0

Veuillez poster un [mcve]. Certaines des conclusions que vous avez soutenues sont soit un contexte incorrect, soit un contexte manquant. – kaylum

+0

Comment est le fichier ouvert? L'affichage d'un code minimal complet serait utile. – chux

Répondre

1

Ce code :

unsigned long character_size = 0; 

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

... a un format invalide spécifié, et doit fournir l'adresse de la variable plutôt que sa valeur. "%l" ne spécifie pas un type à lire. Peut-être que vous voulez "%lu" qui est pour un entier long non signé, qui est comment character_size est défini. character_size doit être &character_size.

Cependant, il n'y a pas de valeur (décimale) au début du fichier d'exemple que vous avez fourni, donc on ne sait pas ce que cette ligne fscanf est vraiment supposée faire.

(Vous avez demandé que l'utilisation de lecture avec le retour de suivi 0:

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

Cependant, il n'y a pas cette ligne dans votre code).

+0

En le changeant en% lu, je reçois un segfault. – SailorCire

+1

'fscanf (temp_fd,"% ld ", & character_size);' Il a besoin de l'adresse de la variable, pas le contenu de celui-ci comme le paramètre – infixed

+0

@infixed en effet, j'ai manqué cela. Merci, édité. – davmac