2011-06-26 8 views
0

J'ai une question très simple concernant l'écriture de fichier.Écrire dans un fichier

J'ai ce programme:

char buf[20]; 
size_t nbytes; 

strcpy(buf, "All that glitters is not gold\n"); 
fd= open("test_file.txt",O_WRONLY); 
write(fd,buf,strlen(buf)); 
close(fd); 

Que suis confus est quand j'ouvre le fichier test_file.txt après l'exécution de ce programme, je vois des personnages comme ^C^@^@^@^^^@ après la ligne « Tout ce qui brille est pas »: Notez que la partie du buf n'est pas écrit et ces caractères apparaissent à la place. Pourquoi est-ce si?

+1

La chaîne '' Tout ce qui brille n'est pas or \ n "' a une longueur de 31 caractères. –

+0

tout à fait stupide de ne pas voir que –

Répondre

6

Vous écrivez plus de 19 caractères dans ce tampon. Une fois que vous avez fait cela, le comportement de votre programme est indéfini. Il pourrait faire ce qu'il veut.

Alloue un tampon suffisamment grand. Il doit être capable de s'adapter à toutes les lettres plus un 0 se terminant si vous devez être en mesure de le traiter comme une chaîne de caractères C.

2

libgcc strcpy Manuel dit:

Si la chaîne de destination d'un strcpy() est pas assez grand (que est, si le programmeur était stupide ou paresseux, et n'a pas réussi à vérifier la taille avant de copier) alors tout peut arriver. Débordement longueur fixe cordes est une technique de cracker préféré . fonction

également le strlen dit

Le strlen() calcule la longueur de la chaîne s, pas y compris la terminaison '\ 0' caractères.

donc je suppose que strlen() ne retourne pas ce que vous attendez pour revenir et en conséquence les caractères supplémentaires sont écrits

Pour rendre le travail de chose, vous devez allouer un assez grand tampon, qui peut contenir la chaîne entière.

5

La chaîne "All that glitters is not gold\n" comporte plus de 20 caractères. Je vous suggère de l'essayer avec un tampon plus grand.

En fait, si vous allez faire un travail non trivial en C, je vous suggère de ne jamais utiliser strcpy, comme une habitude générale. Utilisez des fonctions telles que strncpy qui vous permettent de spécifier une taille de mémoire tampon de manière à ce que vous n'ayez jamais à déborder.

+0

+ 1 pour avertir de l'utilisation de fonctions qui compte octets écrits dans les tampons. – jpmelos