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

Очистить текст от всяких знаков припинания - C++

Восстановить пароль Регистрация
 
итернал
4 / 4 / 0
Регистрация: 17.09.2012
Сообщений: 284
22.05.2013, 22:49     Очистить текст от всяких знаков припинания #1
подскажите пожалуйста, мне необходимо очистить текст от всяких знаков припинания и так далее
вот как я делаю
текст получается я беру из файла
C++
1
2
3
4
5
6
7
8
    FILE *f;
    string bs,t;
    f=fopen("input.txt","r");
    while(!feof(f))
    {
        bs+=fgetc(f);
    }
    fclose(f);
потом ету строку передаю в метод класа
вот код самого метода
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void CFWork::ClearText(string s)
{
    string k;
    for( int i=0;i<s.length();i++)
    {
        if(s.at!=' ' || s.at!='?' || s.at!=',' || s.at!='.' || s.at!='!' ||s.at!=';' || s.at!=':' || s.at!='-' || s.at!='\t' || s.at!='\r\n')
        {
            k+=s.at(i);
        }
    }
    FILE *f;
    f=fopen("input1.txt","w");
    fprintf(f,"%s", k.c_str());
    fclose(f);
}
и оно по идее должно создать txt файл уже без всяких знаков и тд и тп
текст взял с википедии там 4 строчки, ну ето в принцепи неважно, дело в том что оно недействует, просто перезаписывает все так же в новый текстовый документ
подскажите что не так или где у меня ошибка и ище я не уверен в правильности того что я делаю с табуляцией и переходом на новую строку, оно вопще надо?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.05.2013, 22:49     Очистить текст от всяких знаков припинания
Посмотрите здесь:

Програма которая считутет текст с файла и виводит на екран предложения которая имеет найбольше количество знаков пробелов. C++
C++ Использование команды system(); Без всяких окон (без dos и т.д)
C++ Дан текст, каждый символ которого может быть малой буквой, цифрой или одним из знаков +,*,-
Очистить файл C++
Очистить поток C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6156 / 2885 / 281
Регистрация: 04.12.2011
Сообщений: 7,680
Записей в блоге: 3
22.05.2013, 23:54     Очистить текст от всяких знаков припинания #2
итернал, логическое или || замените на && иначе такое условие всегда верно. Ещё иожно бы воспользоваться функцией int ispunct(int) библиотеки <ctype.h>(там ещё много подобных методов)). К целому чар нужно привести явно:
C++
1
2
char ch=',';
if(ispunct((int)ch))/*..что-то...*/;
итернал
4 / 4 / 0
Регистрация: 17.09.2012
Сообщений: 284
23.05.2013, 00:42  [ТС]     Очистить текст от всяких знаков припинания #3
все получилось, вышло и с заменой на && а можно убрать как-то переход на новую строку?
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
23.05.2013, 00:42     Очистить текст от всяких знаков припинания #4
а еще можно заюзать алгоритмы из стандартной библиотеки:
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
#include <algorithm>
#include <iostream>
#include <string>
#include <cctype>
 
bool NeedRemove(char ch)
{
  return ispunct(ch)
      || isspace(ch)
      // other checks
      ;
}
 
void ClearText(std::string& str)
{
  std::string::iterator newEnd = std::remove_if(str.begin(), str.end(), &NeedRemove);
  str.erase(newEnd, str.end());
}
 
int main()
{
  std::string str = "123,!df.-d\nsd? dsxxx\r\ndd12";
  std::cout << "before: = " << str << std::endl;
  ClearText(str);
  std::cout << "after:  = " << str << std::endl;
  return 0;
}
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6156 / 2885 / 281
Регистрация: 04.12.2011
Сообщений: 7,680
Записей в блоге: 3
23.05.2013, 01:06     Очистить текст от всяких знаков припинания #5
DU, да можно не приводить, - само приводится)) Но символов за пределами 0-255 не переносит. Так вроде можно ещё:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include<string>
#include<ctype.h>
using namespace std;
int main()
{
setlocale (LC_CTYPE, "Russian");
string strToclean = "abs, def. gh! ikl>mn& oprs? абаба, галама! га?";
string strCleaned;
for(size_t i=0; i<strToclean.size(); ++i){
if(strToclean[i]<0||strToclean[i]>255){//фильтруем (пропускаем) не английские буквы, т.к. русских букв оно не ест(
strCleaned+=strToclean[i];
 
}else
if(!ispunct(strToclean[i])){
strCleaned+=strToclean[i];
}
}
cout<<strCleaned;
 cout << endl;
 system( "pause" ); 
return 0;
}
Добавлено через 8 минут
вот так переводы уберёт:
C++
1
2
else
if(!ispunct(strToclean[i])&&strToclean[i]!='\n'){
смелее и больше творчества, итернал
Yandex
Объявления
23.05.2013, 01:06     Очистить текст от всяких знаков припинания
Ответ Создать тему
Опции темы

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