2011-12-30 2 views
0

Код, который я пытаюсь написать, должен читать текст из файла txt и разделяться на строки. Я пришел к следующему коду:Strtok Problems C (EOF characters?)

#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); 
} 

Проблема заключается в том, что вывод, что я получаю не только текст (теперь в виде отдельных строк), но и некоторые символы, \ г (что возврат каретки), но также \ 241 \ r \ 002, что я не могу узнать, что это такое? Можете ли вы мне помочь?

+0

твой файл сохранен как юникод? – Ulterior

+0

Вы вызываете 'realloc()' для каждого входного символа, увеличивая размер буфера только на 1 байт. Скорее всего, это будет очень неэффективно. Удвоение размера буфера по мере необходимости будет быстрее. И вам нужно проверить, было ли 'realloc()' успешным или неудачным. –

ответ

2

Основная проблема заключается в том, что вы никогда не ставите нулевой ограничитель в конце строки, которую вы создаете.

Изменение:

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

To:

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

как я могу избежать этого? – Melkon

+0

Это прекрасно работает, но я не могу понять мой код, почему word = strtok (NULL, ""); необходим для правильной печати слов и, кроме того, как я могу получить доступ к каждому слову в указателе слова, если я хочу использовать только один? – Melkon

+1

@ Konstantinos: 'strtok (NULL," ")' необходим для получения следующего токена - это просто способ, которым 'strtok()' предназначен для работы. Я не уверен, что второй вопрос в вашем комментарии означает. –