Форум программистов, компьютерный форум CyberForum.ru

Неполадки с isalpha - C++

Восстановить пароль Регистрация
 
Chernobyl
211 / 211 / 67
Регистрация: 30.09.2012
Сообщений: 526
25.08.2013, 20:36     Неполадки с isalpha #1
Ниже я привел код самой функции.
Суть в том, что я хочу открыть файл и прочитать с него только цифры,английские буквы,разделители и знаки пунктуации.То есть если символ являеться таковым, он заноситься в вектор и будет в дальнейшем использован.

Например в файле лежит дальнейшее - rjnjhst jcyjdfkb vtnfk? - все хорошо, но если там лежит строка вида «njkcnjt», то всё,прога вылетает с ошибками, что что-то больше равно -1 и меньше ровно 255 и всё.Если убрать проверку(тот if, то всё норм и там и там) То есть,как я сейчас понимаю, isalpha не ладит с символом « , из-за чего всё летит. Но я то и хочу использовать isalph'у для того,чтобы эти и подобные символы туда не попадали.

Если переписать код как в варианте 2,то всё уже норм,но теперь просто мучает вопрос - почему в первом варианте всё улетает?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
    void read_from_file(){ //вариант 1
    
    ifstream open("ofile.txt");  
    string word;
    while(getline(open,word)){ 
        for(int i=0;i<word.size();i++){
            if( isalpha(word[i]) || isdigit(word[i]) || isspace(word[i]) || isprint(word[i]))
            text.push_back(word[i]);
        }
                for(int i=0;i<text.size();i++) 
            cout<<text[i]; }
        }
 
 
    void read_from_file(){//вариант второй,выкололи те символы
    
    ifstream open("ofile.txt");
    string word;
    while(getline(open,word)){ 
        for(int i=0;i<word.size();i++){
            if(word[i]!='«' && word[i]!='»'){ //вот эта строка новая
            if( isalpha(word[i]) || isdigit(word[i]) || isspace(word[i]) || isprint(word[i]))
            text.push_back(word[i]);
            }
        }
 
        }
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.08.2013, 20:39     Неполадки с isalpha #2
Вот так попробуйте:
C++
1
isalpha((unsigned char)word[i])
Chernobyl
211 / 211 / 67
Регистрация: 30.09.2012
Сообщений: 526
25.08.2013, 20:45  [ТС]     Неполадки с isalpha #3
alsav22, Если в первый вариант вставить Вашу строку всё хорошо, тот символ не заноситься в вектор,а соотвественно не выводиться на печать, и это хорошо,но в почему так? Насколько знаю, unsigned char больше
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
25.08.2013, 20:52     Неполадки с isalpha #4
что такое "text" в программе?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.08.2013, 20:53     Неполадки с isalpha #5
Цитата Сообщение от Chernobyl Посмотреть сообщение
но в почему так?
Код символа больше 127 (такое же с русскими символами бывает), а char у вас (как, впрочем, и у меня, но не у всех) знаковый. В результате преобразований получается очень большое число, отсюда вылет.
Chernobyl
211 / 211 / 67
Регистрация: 30.09.2012
Сообщений: 526
25.08.2013, 21:02  [ТС]     Неполадки с isalpha #6
Nekto, Оууу,сам только что заметил,что не скопировал толково, это вектор состоящий из char. Прошу прощения.

Добавлено через 7 минут
alsav22, Благодарю, может еще сможете сказать. Я хочу, чтобы если в файле был введен энтер(то есть есть символ перехода на новую строку), то и вывести на печать тоже с энтером, а не всё в одну строку. Но как считать символ энтера,то есть понять,что в файле есть энтер.
С гугла узнал, что это и /n и /p,но как-то не выходит у меня их выследить.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
25.08.2013, 21:04     Неполадки с isalpha #7
...
GetVariable
 Аватар для GetVariable
163 / 119 / 5
Регистрация: 17.03.2013
Сообщений: 283
25.08.2013, 21:10     Неполадки с isalpha #8
http://www.cplusplus.com/reference/cctype/
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.08.2013, 21:12     Неполадки с isalpha #9
Цитата Сообщение от Chernobyl Посмотреть сообщение
Я хочу, чтобы если в файле был введен энтер(то есть есть символ перехода на новую строку), то и вывести на печать тоже с энтером, а не всё в одну строку.
getline() читает до '\n' (или до конца файла), извлекает '\n' и отбрасывает. Можно самому добавлять в считанную строку '\n'.
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
25.08.2013, 21:21     Неполадки с isalpha #10
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <fstream>
#include <string>
 
std::string text;
void ReadFromFile()
  {
  std::ifstream file("ofile.txt");  
  char ch;
  while(file.good())
    {
    ch=file.get();
    if ( (ch>=32 && ch<127) || (ch>=9 && ch<=13) )
        text.push_back(ch);
    }
  }
 
int main()
  {
  ReadFromFile();
  for(size_t i=0;i<text.size();++i) 
    std::cout<<text[i]; 
  system("pause");
  return 0;
  }
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.08.2013, 21:22     Неполадки с isalpha #11
Цитата Сообщение от Chernobyl Посмотреть сообщение
Я хочу, чтобы если в файле был введен энтер(то есть есть символ перехода на новую строку), то и вывести на печать тоже с энтером, а не всё в одну строку.
После выхода из цикла, в котором добавляются символы в вектор, добавить в него '\n':
C++
1
text.push_back('\n');
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.08.2013, 21:42     Неполадки с isalpha
Еще ссылки по теме:

C++ Какой есть аналог isalpha для работы с русским алфавитом?
C++ аналог функции isalpha() (<cctype>)
C++ Isalpha;isdigit неверное употребление функций?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Chernobyl
211 / 211 / 67
Регистрация: 30.09.2012
Сообщений: 526
25.08.2013, 21:42  [ТС]     Неполадки с isalpha #12
alsav22, Да, работает,огромное спасибо! Теперь я немного лучше познал эту функцию и сам принцип действия кода.

Добавлено через 5 минут
Nekto, Не могу не выразить Вам также величайшую благодарность за Ваш труд. Особенно когда увидел, что Вы отредактировали свой изначальный код специально для энтеров.
Также большое спасибо!
Yandex
Объявления
25.08.2013, 21:42     Неполадки с isalpha
Ответ Создать тему
Опции темы

Текущее время: 20:33. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru