2017-08-06 7 views
-1

J'avais fait un programme qui crée un fichier avec le nom donné par un utilisateur.fgets fonction impression garbage à la fin

#include <stdlib.h> 
#include <stdio.h> 
#include <fcntl.h> 
int main() 
{ 
     int g; 
     char file[15]; 
     fgets(file,15,stdin); 
     g=open(file,O_CREAT | O_WRONLY,__S_IWRITE); 


} 

Mais il crée un fichier avec un nom de fichier avec un caractère de poubelle à la fin. Comment puis-je corriger cela?

est géré par exemple ici:

$ ./a.out 
coolfile.txt 
$ ls 
a.out coolfile.txt? test.c 

le même programme, mais juste en utilisant la fonction obtient donne le nom de fichier correct, mais je l'avais entendu dire que se ne devrait pas être utilisé.

+0

Actuellement, il n'y a pas d'appel à une fonction d'écriture dans le code et s'il vous plaît nous montrer le contenu du fichier. En outre, vous devez toujours fermer vos descripteurs de fichier après en avoir ouvert un. 'Fgets()' conserve le '' n'n'admet pas le ' – PhilMasterG

+2

'. Probable que le caractère est un problème pour les noms de fichiers imprimables – chux

+0

@PhilippGrassl Le fichier est vide.J'avais utilisé la commande cat –

Répondre

2

fgets magasins \n à e fin de chaque ligne ainsi vous devez supprimer cette \n

pour dot cette utilisation strcspn fonction

donc votre code devrait ressembler à ceci

#include <stdlib.h> 
#include <stdio.h> 
#include <fcntl.h> 
#include <string.h> 
int main() 
    { 
    int g; 
    char file[15]; 
    fgets(file,15,stdin); 
    file[strcspn(file, "\n")] = 0; 
    g=open(file,O_CREAT | O_WRONLY,__S_IWRITE); 
    } 

Vous pouvez voir plus d'informations sur strcspn sur: - https://www.tutorialspoint.com/c_standard_library/c_function_strcspn.htm

Voir également: - Removing trailing newline character from fgets() input

1

fgets() stocke la nouvelle ligne à la fin de chaque ligne dans le résultat. Vous créez donc des fichiers dont les noms se terminent par un caractère de retour à la ligne. Pour le réparer, il suffit de cocher le dernier caractère et de le définir sur '\0' s'il s'agit de '\n'.