2012-11-02 6 views
0

Je suis en train de lire un chemin à partir d'un simple fichier de configuration et de le stocker dans un tableau de caractères en utilisant le langage C. Je suis arrivé avec un moyen de le faire, mais j'ai un problème avec la récupération du chemin sans espaces blancs attachés à la fin de celui-ci. Aidez-moi s'il vous plaît à trouver une meilleure façon de le faire.Lecture à partir d'un fichier de configuration

char* webroot(){ 
FILE *in = fopen("conf", "rt"); 
char buff[1000]; 
fgets(buff, 1000, in); 
printf("first line of \"conf\": %s\n", buff); 
fclose(in); 

return buff; 
} 

Répondre

2

Il est pas une séquence de caractères d'espacement à la fin, mais le caractère de nouvelle ligne, comme fgets() 'il comprend dans le tampon de retour: remplacer le \n avec un terminateur null:

/* fgets() will not read the new-line if 
    there is not sufficient space in the buffer 
    so ensure it is present. */ 
char* nl_ptr = strrchr(buff, '\n'); 
if (nl_ptr) *nl_ptr = '\0'; 

Il peut Apparaît comme s'il y avait une séquence de caractères blancs à cause de la ligne apparente sur stdout, mais cela est dû à la présence du caractère de nouvelle ligne lu par fgets().

Lorsque les chaînes d'impression je trouve utile de placer la chaîne à l'intérieur [] pour rendre le contenu de la chaîne plus claire:

printf("first line of \"conf\": [%s]\n", buff); 

cela rendrait la présence du caractère de nouvelle ligne obtenue par fgets() plus visible.

Notez que la fonction webroot() renvoie l'adresse de la variable locale buff: il s'agit d'une erreur et d'un comportement non défini. Un nouveau tampon devra être réparti de façon dynamique, en utilisant strdup() si elle est disponible ou malloc() et strcpy() autrement:

return strdup(buff); 

l'appelant de webroot() doit free() la valeur retournée. Disposez que NULL est renvoyé si une erreur se produit.

+0

Selon le système d'exploitation, vous pouvez également avoir un caractère '\ r'. –

+0

Merci beaucoup pour la bonne explication. Maintenant ça marche comme un charme :) Merci encore !!! –

1

Vous pouvez utiliser fscanf(fp, "%s", buff) pour lire une chaîne sans espaces. Pour éviter un débordement de tampon, ajoutez une limite fscanf(fp, "%999s", buff).

0

Avez-vous essayé d'utiliser fscanf?

fscanf(in, "%s", buff); 
Questions connexes