2016-12-26 1 views
3

J'ai utilisé fwrite pour stocker des données et maintenant j'essaie d'utiliser fread pour lire les données du fichier txt pour le traitement. Je veux lire les valeurs individuellement, mais je n'arrive pas à comprendre comment vous feriez cela. Voilà ce que j'ai essayé:Comment utiliser fread pour lire une valeur de fichier par valeur?

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    FILE * pFile; 
    long lSize; 
    unsigned short * buffer; 
    size_t result; 

    pFile = fopen ("myfile.txt" , "rb"); 

    // obtain file size: 
    fseek (pFile , 0 , SEEK_END); 
    lSize = ftell (pFile); 
    rewind (pFile); 

    // allocate memory to contain the whole file: 
    buffer = (unsigned short *) malloc (sizeof(unsigned short)*lSize); 

    // copy the file into the buffer: 
    result = fread (buffer,1,lSize,pFile); 

    printf("%uz\n", result); 

    // terminate 
    fclose (pFile); 
    free (buffer); 
    return 0; 
} 

Le programme ci-dessus compile bien, mais quand je le lance avec ./a.out je reçois une erreur de segmentation. Quand je l'exécute avec sudo ./a.out je n'obtiens pas de faute de seg, mais rien ne s'imprime. Une idée de ce que je peux faire pour le réparer?

+0

Est-ce une erreur de vérification ici: 'pfile = fopen ("myfile.txt", "rb"); ' –

+0

@ πάνταῥεῖ Qu'est-ce que wo Je vérifie? Cela ouvre juste le fichier. Tant que le nom de fichier est correct, cela devrait fonctionner correctement. –

+0

Vous n'avez jamais vérifié la valeur de retour par rapport à 'NULL'! –

Répondre

1

problèmes que je vois:

Allouer plus de mémoire que nécessaire

Après

lSize = ftell (pFile); 

lSize est réglé sur le nombre de caractères dans le fichier, pas le nombre de unsigned short s. Par conséquent, vous avez besoin

buffer = malloc(lSize); 

Voir Do I cast the result of malloc?. Si vous utilisez un compilateur C++ (comme l'indique votre balise C++), vous devez convertir la valeur de retour malloc.

spécificateur format incorrect

printf("%s\n", result); 

utilise le spécificateur de format incorrect pour imprimer result. Vous devez utiliser

printf("%zu\n", result); 

Cette ligne est le coupable le plus probable pour la faute de segmentation que vous voyez.


objets de lecture, un par un

Vous pouvez certainement utiliser:

size_t count = lSize/sizeof(short); 
for (size_t i = 0; i < count; ++i) 
{ 
    unsigned short number; 
    result = fread (&number, sizeof(unsigned short), 1, pFile);   
} 

Vous pouvez également utiliser:

size_t count = lSize/sizeof(short); 
for (size_t i = 0; i < count; ++i) 
{ 
    result = fread (buffer+i, sizeof(unsigned short), 1, pFile);   
} 
+0

Mais les valeurs écrites dans le fichier sont de type unsigned short. Quand je fais ce que vous avez dit, j'ai juste un tas de '1z 'imprimé sur l'écran. –

+0

La valeur de retour de 'fread' est le nombre d'objets lus. Si vous lisez un objet à la fois, la valeur de 'result' sera' 1'. Vous voyez '1z' comme sortie en raison d'une erreur dans le format que j'avais suggéré. Il devait être '"% zu "' au lieu de '"% uz "'. J'ai corrigé l'erreur dans la réponse. –