2011-12-30 3 views
0

le code que j'essaye d'écrire est censé lire le texte d'un fichier txt et le séparer en chaînes. Je suis venu au code suivant:Problèmes de Strtok C (caractères EOF?)

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
int main(){ 
    FILE *fp; 
    int i=0; 
    char *words=NULL,*word=NULL,c; 
    if ((fp=fopen("monologue.txt","r"))==NULL){ /*Where monologue txt is a normal file with plain text*/ 
     printf("Error Opening File\n"); 
     exit(1);} 
    while ((c = fgetc(fp))!= EOF){ 
     if (c=='\n'){ c = ' '; } 
     words = (char *)realloc(words, ++i*sizeof(char)); 
     words[i-1]=c;} 
    word=strtok(words," "); 
    while(word!= NULL){ 
     printf("%s\n",word); 
     word = strtok(NULL," ");} 
    exit(0); 
} 

Le problème est que la sortie que je reçois est non seulement le texte (maintenant sous forme de chaînes séparées), mais aussi des personnages qui sont \ r (qui est de retour chariot), mais aussi \ 241 \ r \ 002 que je ne peux pas savoir ce qu'ils sont? Peux-tu m'aider?

+0

est votre fichier enregistré en tant que unicode? – Ulterior

+0

Vous appelez 'realloc()' pour chaque caractère d'entrée, augmentant la taille du tampon de 1 octet seulement. Cela risque d'être très inefficace. Doubler la taille de la mémoire tampon au besoin sera plus rapide. Et vous devez vérifier si 'realloc()' a réussi ou échoué. –

Répondre

2

Le problème principal est que vous ne placez jamais un terminateur null à la fin de la chaîne que vous créez.

Change:

while ((c = fgetc(fp))!= EOF){ 
     if (c=='\n'){ c = ' '; } 
     words = (char *)realloc(words, ++i*sizeof(char)); 
     words[i-1]=c;} 
    word=strtok(words," "); 

Pour:

while ((c = fgetc(fp))!= EOF){ 
     if (c=='\n'){ c = ' '; } 
     ++i; 
     words = (char *)realloc(words, i + 1); 
     words[i-1]=c;} 
    words[i] = '\0'; 
    word=strtok(words," "); 
+0

comment puis-je éviter cela? – Melkon

+0

Cela fonctionne parfaitement maintenant mais je ne peux pas comprendre sur mon code pourquoi le word = strtok (NULL, ""); est nécessaire pour les mots pour imprimer correctement et en outre comment puis-je accéder à chaque mot dans le pointeur de mot si je veux en utiliser un seul? – Melkon

+1

@Konstantinos: Le 'strtok (NULL," ")' est nécessaire pour obtenir le prochain jeton - c'est exactement comme ça que 'strtok()' est conçu pour fonctionner. Je ne suis pas sûr de savoir quelle est la deuxième question de votre commentaire. –