2010-09-17 2 views
0

Мне нужно прочитать текстовый файл; однако один текстовый файл дает мне проблемы. Мало того, что текстовый файл огромен (вся электронная книга), но есть также несколько акцентированных букв. Я читаю в словах одну букву, останавливаясь при соответствующей пунктуации или пробелах. Я делаю это, проверяя соответствующий ASCII для букв и знаков препинания, таких как апостроф. есть ли способ, которым я могу читать в акцентированных письмах, но держать их отдельно от других букв? Нужно ли добавлять какие-либо случайные библиотеки?проблемы с вводом текстового файла в C++

Вот мой код, чтобы получить слово:

string GetNextWord(){ 
string w="";       // used to store each word temporarly 
    char c;         // used for each individual character 
    int i=0;        // a counter 
input.get(c);       // gets first character 
c=tolower(c);       // forces c to lowercase 

while(c>=97 && c<=122 || c==39){  // loops while the character is a lowercase letter or ' 
    w=w+c;        // adds character to word string 
    input.get(c);      // gets next character 
    c=tolower(c);      // forces c to lowercase 
++i;         // increments counter 
} 
if(i>0)         // if there is a word 
    return w;       // return the word 
else         // otherwise string is NULL 
     return "NOT A WORD!";    // returns a flag to main 
} 

Работы по каждому файлу до сих пор, за исключением, это одно.
Здесь вы можете найти здесь ->http://www.gutenberg.org/cache/epub/244/pg244.txt

ответ

0

Акцентированные символы ASCII выходят за пределы обычного набора символов. то есть выше 127. Вы не совсем поняли, что «работает над каждым файлом до сих пор», но, глядя на вышеизложенное, если вы используете символы с акцентом, я предполагаю, что вы входите в бесконечный цикл. Чтобы правильно обрабатывать расширенные символы, вам нужно знать, на какой кодовой странице вы имеете дело. Я также не уверен, правильно ли std::tolower обрабатывает расширенные символы в ASCII, по крайней мере, не говоря уже о том, что такое языковая/кодовая страница.

+0

Он работает с файлами с цифрами, пунктуацией, заглавными и строчными буквами, поэтому акцентированные буквы - это единственное, что вызывает у меня проблемы. Я согласен с вашей идеей, что она идет в бесконечный цикл. использование пространства имен std; –

+0

Это вам поможет? –

+0

Существует множество способов представления акцентированных букв. Скорее всего, вы видите кодировку latin1, что означает, что вы должны добавить '|| (c> = 161 && c <= 255) 'для теста while – MattSmith