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

Поиск в тексте - C++

Восстановить пароль Регистрация
 
landan
7 / 7 / 0
Регистрация: 07.07.2010
Сообщений: 157
13.07.2010, 22:28     Поиск в тексте #1
Помогите пожалуйста
В файле имеется текст.
Найти отсутствие пробелов после точки в конце предложения, исправить ошибки и сохранить файл.
Предложением считать часть текста, что кончается "." или начинается с нового рядка
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.07.2010, 22:28     Поиск в тексте
Посмотрите здесь:

C++ Поиск слова в тексте.
C++ Поиск букв в тексте
C++ Поиск и оптимизация в тексте.
Поиск слова в тексте C++
Поиск слов в тексте C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
14.07.2010, 02:29     Поиск в тексте #2
landan, C аль C++?

Добавлено через 46 минут
или начинается с нового рядка Но как после этого могут идти пробелы? оО

Добавлено через 46 минут
Что-то пытался... Не слишком качественно вышло... После точки удаляет пробелы... В других случаях не всегда...

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    FILE*f=fopen("Read.txt", "r");
    if(!f)
    {
        printf("Can`t open file\n");
        exit(1);
    }
    char Str[255][255];
    int Col_str=0;
    int i=0;
    while(!feof(f))
    {
        fgets(Str[i], 255, f);
        Col_str++;
        i++;
    }
    i=0;
    //printf("%s\n", Str[i]);
    for(int j=0;j<strlen(Str[i]);j++)
            {
                if(Str[i][j]=='.')
                {
                    if(Str[i][j+1]==' ')
                    {
                        //Str[i][j+1]='\n';
                        Str[i][j+1]='\0';
                    }
                }
                if(Str[i][j+1]=='\0')
                {
                    //fprintf(f,"\n");
                    i++;
                    if(i>=Col_str)
                        break;
                    j=0;
                    if(Str[i][j]==' ')
                        for(int j=0;j<strlen(Str[i]);j++)
                            Str[i][j]=Str[i][j+1];
                }
            }
        //printf("%s\n", Str[i]);
    fclose(f);
        f=fopen("Read.txt", "w");
        if(!f)
        {
            printf("Can` open file\n");
            exit(1);
        }
        for(int i=0;i<Col_str;i++)
            fprintf(f, "%s\n", Str[i]);
    return 0;
}
Aye Aye
 Аватар для Aye Aye
367 / 281 / 36
Регистрация: 17.12.2009
Сообщений: 567
14.07.2010, 03:24     Поиск в тексте #3
можно попроще с заменой файла
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
#include <cstdlib>
#include <fstream>
using namespace std;
int main()
{
    ifstream in("input.txt");
    ofstream out("output.txt");
    char c;
    while (!in.eof())
    {
         in.get(c);
         if (c=='.')
         {
             out.put('.');
             in.get(c);
             if (c != ' ') out.put(' ');
             out.put(c);
         }
         else out.put(c);
     }
     in.close();
     out.close();
     remove("input.txt");
     rename("output.txt","input.txt");
     return 0;
}
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
14.07.2010, 03:56     Поиск в тексте #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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <iostream>
#include <cstdlib>
#include <string>
#include <vector>
#include <fstream>
#include <cstring>
int main()
{
    std::vector<std::string> BaseStringArr;
    std::string BaseString;
    std::ifstream f;
    int count_spaces=0;
    f.open("Read.txt");
    if(!f)
    {
        std::cerr<<"Error. Can`t open file\n";
        exit(1);
    }
    while(!f.eof())
    {
        std::getline(f, BaseString);
        std::string::size_type index=BaseString.find_first_of('.');
        if(index!=std::string::npos)
            BaseString.erase(index+1);
        for(size_t i=0;i!=BaseString.size();i++)
        {
            if(BaseString[i]==' ')
                count_spaces++;
            if(isalpha(BaseString[i]))
                break;
        }
        BaseString.erase(0, count_spaces);
        BaseStringArr.push_back(BaseString);
    }
    for(size_t i=0;i<BaseStringArr.size();i++)
    {
        std::cout<<BaseStringArr[i]<<'\n';
    }
    f.close();
    std::ofstream file;
    file.open("Read.txt");
    if(!file)
    {
        std::cerr<<"Error. Can`t open file\n";
        exit(1);
    }
    for(size_t i=0;i<BaseStringArr.size();i++)
    {
        file<<BaseStringArr[i]<<'\n';
    }
        file.close();
    return 0;
}
Добавлено через 11 минут
Не могу понять почему он постоянно пишет в файле еще одну строку полностью пустую...
Aye Aye
 Аватар для Aye Aye
367 / 281 / 36
Регистрация: 17.12.2009
Сообщений: 567
14.07.2010, 04:15     Поиск в тексте #5
Lavroff, вот почему:
C++
1
2
3
4
        for(size_t i=0;i<BaseStringArr.size();i++)
        {
                file<<BaseStringArr[i]<<'\n';
        }
во время последней итерации пренос строки заносится в файл.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
14.07.2010, 05:24     Поиск в тексте #6
Aye Aye, Верю. Я это понял) Как исправить?) Если без '\n' хреново получается. В другой файл писать?
Aye Aye
 Аватар для Aye Aye
367 / 281 / 36
Регистрация: 17.12.2009
Сообщений: 567
14.07.2010, 06:12     Поиск в тексте #7
что угнодно можно сделать, хоть:
C++
1
2
3
4
5
       for(size_t i=0;i<BaseStringArr.size() - 1;i++)
        {
                file<<BaseStringArr[i]<<'\n';
        }
        file<<BaseStringArr[BaseStringArr.size()-1];
я думаю '\n' это не важно. Кстати, решать задачу сразу переписаывая все в другой файл, кажется мне приемлимым, ибо в ином случаи расходуется больше ресурсов.
landan
7 / 7 / 0
Регистрация: 07.07.2010
Сообщений: 157
14.07.2010, 14:47  [ТС]     Поиск в тексте #8
вы меня наверное не правильно поняли, програма должна не удалять пробел а наоборот, делать пробел после точки если его там нет. предложением считать часть текста, которая кончается точкой или символоп перехода на новою строку

писать на си

Добавлено через 1 час 32 минуты
Aye Aye, ваша програма отлично работает, только я не пойму, зачем output.txt ?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
14.07.2010, 15:37     Поиск в тексте #9
landan, Ох елки палки. Точно. Прошу прощения.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.07.2010, 01:11     Поиск в тексте
Еще ссылки по теме:

поиск слов в тексте C++
C++ Поиск букв в тексте
Поиск слов в тексте C++

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

Или воспользуйтесь поиском по форуму:
Aye Aye
 Аватар для Aye Aye
367 / 281 / 36
Регистрация: 17.12.2009
Сообщений: 567
16.07.2010, 01:11     Поиск в тексте #10
landan, это результат работы программы, в этот файл записывается "переделанный" исходный файл, затем исоходный файла, без палева, удаляется и этот новый файл переименовывается в соответствии с именем старого на чистом Си все выглядит примерно также. и забыл о том, что конец строки тоже полагается учитывать, ну тут уж сам как-нибудь...
Yandex
Объявления
16.07.2010, 01:11     Поиск в тексте
Ответ Создать тему
Опции темы

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