2016-12-26 1 views
1

Je lis du fichier à la chaîne avec la fonction fread, puis j'imprime la chaîne. J'ai défini la chaîne comme un tableau de caractères de taille LONGNUM (valeur prédéfinie). Je lis 1 élément 1 taille d'octet à chaque fois. lors de l'impression de la chaîne avec: printf ("la chaîne lue est:% s \ n", buffer); la sortie est: la chaîne qui lit est b Je ne comprends pas, pourquoi à la fin du stringi obtenir ces valeurs? lors de l'impression de la chaîne avec: printf ("la chaîne lue est:% c \ n", buffer [0]); Je reçois la sortie d'écriture sans valeurs. expliquez-moi pourquoi.L'impression d'une chaîne avec% s imprime des données erronées

le code est

#include <stdio.h> 
#define LONGNUM 1 

void main(int argc,char *argv[]) 
{ 

    FILE * src; 
    FILE * dst; 
    int num; 
    char buffer[LONGNUM]; 

    // argc is the number of the elements in argv 
    // the first argv element is the name of the program 

    if(argc < 3){ 
     printf("prototype error <source path> <dest path>\n"); 
     return; 
    } 
    printf ("source path is : %s \n",argv[1]); 
    printf ("dest path is : %s \n",argv[2]); 

    src = fopen(argv[1],"r"); 

    while(!(feof(src))){ 
     num = fread(buffer,1,1,src); 
     printf("the number of items read %d\n",num); 
     printf("the string that read is %s\n",buffer); 
     //printf("the string that read is %c\n",buffer[0]); 

    } 

} 

Je voudrais que vous me conseillez quel est le chemin d'écriture pour le faire. Merci.

+3

'% s' a besoin d'au moins deux octets - donc' LONGNUM' devrait être d'au moins 2, et vous devrez spécifier '% 1s' pour lire un caractère dans la chaîne. Vous pouvez utiliser '% c' pour lire un caractère, mais votre 'chaîne' ne sera pas terminée par un caractère nul. Plus judicieusement, réglez 'LONGNUM' sur 128 ou 4096 ou sur quelque chose d'autre. –

+2

while (! (Feof (src)) est faux car il teste quelque chose qui n'est pas pertinent et ne vérifie pas ce que vous devez savoir, ce qui fait que vous exécutez du code qui suppose qu'il accède à des données qui étaient lire avec succès, alors qu'en fait cela ne s'est jamais produit –

+0

@SumitGemini: la question standard de x-ref est ['while (! feof (file))' est toujours faux] (http://stackoverflow.com/questions/5431941/while -feof-file-is-always-wrong) –

Répondre

1

Le spécificateur% s attend une chaîne de terminaison nulle. fread ne termine pas la chaîne avec null, donc vous ne voyez pas la sortie correcte. Puisque le tampon est de longueur 1,% c est le spécificateur correct à imprimer.

+1

@Stargateur: Il semble que vous fournissez le mauvais lien. – alk

+2

un petit problème que vous pouvez faire 'printf ("%. 1s ", buffer)', [référence] (http://stackoverflow.com/a/3767300/7076153). @alk fixe, merci. – Stargateur