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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 34, средняя оценка - 4.94
uto
6 / 6 / 0
Регистрация: 07.05.2009
Сообщений: 94
#1

Выделить в тексте лишние пробелы между словами - C++

19.05.2009, 05:25. Просмотров 4159. Ответов 16
Метки нет (Все метки)

ЕЩе одна задачка из Павловской... Прошу помощи!!! Если вам лень решать всю задачу, то меня очень интересует второй пункт... Но буду рад решению всей задачи

С помощью текстового редактора создать файл, содержащий текст, длина которого не превышает 500 символов (длина строки текста не должна превышать 70 символов).
Имя файла должно иметь расширение DAT.
Написать программу, которая:
- выводит текст на экран дисплея;
- по нажатию произвольной клавиши поочередно выделяет в тексте лишние пробелы между словами;
- выводит текст на экран дисплея еще раз, убирая лишние пробелы между словами и начиная каждое предложение с новой строки.

Добавлено через 8 минут 59 секунд
Первая часть есть, помогите с остальным =)

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
#include <iostream.h>
#include <fstream.h>
#include <conio.h>
 
//---------------------------------------------------------------------------
 
#pragma argsused
int main(int argc, char* argv[])
{
        char buf [70];
    ifstream f ("file.DAT", ios::in);
    if (!f)  {
        cout << "Error of opening of a file.";  return 1;
    }
 
    while (!f.eof())  
    {
        f.getline(buf, 70);
 
        cout << buf << endl;
        }
        getch();
        return 0;
}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.05.2009, 05:25     Выделить в тексте лишние пробелы между словами
Посмотрите здесь:

В тексте убрать лишние пробелы и разделительные символы C++
Вывести на экран содержимое файла удалив лишние пробелы между словами C++
C++ Исключить лишние пробелы между словами (комментарии)
C++ Убрать в текстовом файле ненужные пробелы, оставив между словами по одному, между предложениями по два.
C++ Работа с файлами. Удалить все лишние пробелы, оставив между словами не более одного пробела
Строка: Удалить лишние пробелы между словами C++
Не работает код (программа считывает из файла строку, убирает лишние пробелы и записывает в другой файл строку, словами наоборот) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
RazorQ
576 / 343 / 9
Регистрация: 06.02.2009
Сообщений: 1,386
19.05.2009, 08:25     Выделить в тексте лишние пробелы между словами #2
Цитата Сообщение от uto Посмотреть сообщение
C++
1
ifstream f ("file.DAT", ios::in);
Открывать надо в двоичном режиме
C++
1
ifstream f ("file.DAT", ios::in | ios::binary);
uto
6 / 6 / 0
Регистрация: 07.05.2009
Сообщений: 94
19.05.2009, 10:06  [ТС]     Выделить в тексте лишние пробелы между словами #3
RazorQ, а причем тут двоичный режим? В задание это не указано.
accept
4817 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
19.05.2009, 10:26     Выделить в тексте лишние пробелы между словами #4
Код
    char buf [70];
туда поместится 69 символов, потому что строка - это понятие такое в C "набор символов, заканчивающийся нуль-символом" и в строке может быть ноль символов (то есть только нуль-символ) => strlen и покажет 0

Цитата Сообщение от uto
лишние пробелы между словами
это можно решить через поиск двух пробелов в строке - функция strstr
Код
strstr(строка, "  ")
когда нашёл, можно применить
Код
strspn(позиция, " ")
это выдаст сколько там пробелов подряд

выделять наверное с помощью какой-нибудь нестандартной функции из conio.h (там были функции для раскрашивания символов)
uto
6 / 6 / 0
Регистрация: 07.05.2009
Сообщений: 94
20.05.2009, 11:02  [ТС]     Выделить в тексте лишние пробелы между словами #5
Блин, уже который час ломаю голову, как сделать так, чтобы выводилась строка, но при этом выделяла каждый лишний пробел...

Пока вот, что получилось...
Там все до кучи =)
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
#include <stdio.h>
#include <tchar.h>
#include <iostream.h>
#include <fstream.h>
#include <conio.h>
#include <windows.h>
 
//---------------------------------------------------------------------------
 
#pragma argsused
int main(int argc, char* argv[])
{
 
HANDLE hConsole=GetStdHandle(STD_OUTPUT_HANDLE);
 
        char buf [71]; char blank [2];
    ifstream f ("file.DAT", ios::in);
    if (!f)  {
        cout << "Error of opening of a file.";  return 1;
    }
 
    while (!f.eof())
    {
        f.getline(buf, 71);
                blank [2] = ' ';
                strstr(buf, blank);
        SetConsoleTextAttribute(hConsole, FOREGROUND_RED|BACKGROUND_RED|
BACKGROUND_GREEN|BACKGROUND_INTENSITY);  //background coloring demonstration
        cout << blank;
 
        SetConsoleTextAttribute(hConsole, FOREGROUND_RED|
FOREGROUND_GREEN|FOREGROUND_BLUE);
        cout << buf << endl;
        getch();
        }
        getch();
        return 0;
}
RIO
15 / 15 / 1
Регистрация: 13.05.2009
Сообщений: 331
20.05.2009, 22:22     Выделить в тексте лишние пробелы между словами #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Сделал без подсветки :

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
#include <iostream.h>
#include <fstream.h>
#include <conio.h>
#include <string>
 
using namespace std;
 
int main(int argc, char* argv[])
{
    int I;
    string Result, R;
    ifstream F("File.DAT", ios::in);
    if (!F)
    {
       cout << "Error of opening of a file.";
       return 1;
    }
    while (!F.eof())
    {
          getline(F, R);
          Result += R;
    }
    R = "";
    cout<<Result;
    for (I = 0; I < Result.size(); I++)
    {
        if (Result[I] != ' ')
           R += Result[I];
        else
        {
           cout<<"\n";
           cout<<R;
           R = "";
        }
        if (I == Result.size() - 1)
        {
           cout<<"\n";
           cout<<R;
        }
    }
    getch();
    return 0;
}
accept
4817 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
21.05.2009, 04:02     Выделить в тексте лишние пробелы между словами #7
здесь выводятся позиции повторяющихся пробелов и их количество
Вложения
Тип файла: zip space_position.zip (443 байт, 43 просмотров)
uto
6 / 6 / 0
Регистрация: 07.05.2009
Сообщений: 94
22.05.2009, 19:25  [ТС]     Выделить в тексте лишние пробелы между словами #8
А для чего это?
Что дадут мне позиции пробелов и их кол-ва?
accept
4817 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
23.05.2009, 07:16     Выделить в тексте лишние пробелы между словами #9
Код
- по нажатию произвольной клавиши поочередно выделяет в тексте лишние пробелы между словами;
- выводит текст на экран дисплея еще раз, убирая лишние пробелы между словами и начиная каждое предложение с новой строки.
ну, когда строки выводишь, в них узнаёшь позиции и, смотря как там раскрашиваешь (сразу или предварительно) раскрашиваешь с позиции на длину или выводишь с позиции на длину с другим цветом

потом точно так же, с этих позиции можно перезаписывать строки, удаляя пробелы кроме последнего и потом выводить
uto
6 / 6 / 0
Регистрация: 07.05.2009
Сообщений: 94
23.05.2009, 08:24  [ТС]     Выделить в тексте лишние пробелы между словами #10
Я вообще как понял реализацию...
Сначала мы ищем первые лишние пробелы, раскрашиваем. Потом вторые, раскрашиваем и т.д., а как конец файла, все выделенные пробелы удаляются. Но у меня как то не получается выделить их
accept
4817 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
23.05.2009, 08:58     Выделить в тексте лишние пробелы между словами #11
Цитата Сообщение от uto
все выделенные пробелы удаляются
не, ты их не найдёшь
надо два раза текст читать и два раза его выводить, первый раз раскрашивать, потом делать нестандартный clrscr и второй раз, читая текст, определять где лишние пробелы (у тебя, конечно, проще выглядит, если читать посимвольно типа и пробелы лишние определять, но так ты ещё дольше будешь писать прогу), читать текст можно построчно и работать со строкой, пока она в памяти, через уже готовые функции поиска, правки и вывода, а потом уже выводить её на экран

Добавлено через 3 минуты 30 секунд
хотя, можно попробовать, выводя текст посимвольно на каждом втором пробеле проматывать до непробела и, если встретится конец файла, просто закончить, а если символ, то продолжить вывод (и так в цикле)
uto
6 / 6 / 0
Регистрация: 07.05.2009
Сообщений: 94
23.05.2009, 09:26  [ТС]     Выделить в тексте лишние пробелы между словами #12
А как считать текст дважды? Как я понимаю, надо переместить указатель вначало после первого прочтения. А как это делается?
accept
4817 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
23.05.2009, 09:41     Выделить в тексте лишние пробелы между словами #13
rewind(file); - описана в stdio.h
Monte-Cristo
2786 / 1372 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
23.05.2009, 09:44     Выделить в тексте лишние пробелы между словами #14
fseek()
uto
6 / 6 / 0
Регистрация: 07.05.2009
Сообщений: 94
23.05.2009, 09:45  [ТС]     Выделить в тексте лишние пробелы между словами #15
Цитата Сообщение от accept Посмотреть сообщение
rewind(file)
Т.е. внутри надо писать название самого файла?

Добавлено через 31 секунду
Цитата Сообщение от Monte-Cristo Посмотреть сообщение
fseek()
Эээ, т.е. можно двумя способами чтоли?
accept
4817 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
23.05.2009, 12:06     Выделить в тексте лишние пробелы между словами #16
Цитата Сообщение от uto
Т.е. внутри надо писать название самого файла?
не, указатель на файл, что обычно fgetc передаёшь, чтобы к файлу обращаться (это структура такая, там к ней подцеплен буфер, файловый дескриптор, полученный от системы, созданы флажки, ну типа закончился ли файл, есть ли ошибки чтения и так далее), то есть через неё обычно функции, работая с файлом, отмечают его состояние и вот этот указатель файла, тоже может быть указателем не в файле а в буфере
fseek тоже со структурой работает

C
1
fseek(file, 0L, SEEK_SET);
установит указатель файла file, на расстояние 0 байт от позиции SEEK_SET (это начало)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.05.2009, 19:58     Выделить в тексте лишние пробелы между словами
Еще ссылки по теме:

C++ В тексте удалить лишние пробелы и расположить слова в порядке возрастания длинн
Довести длину строки до заданной, вставляя пробелы между словами C++
Удалить в строке лишние пробелы, оставив между словами ровно по одному C++
C++ Пробелы между словами\предложениями
C++ Напечатать текст, выпустив повторяющиеся пробелы между словами

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

Или воспользуйтесь поиском по форуму:
uto
6 / 6 / 0
Регистрация: 07.05.2009
Сообщений: 94
25.05.2009, 19:58  [ТС]     Выделить в тексте лишние пробелы между словами #17
Скажите, если у меня есть код удаления всех лишних пробелов, моя лаба на сколько % уже завершена?

Добавлено через 3 часа 43 минуты 43 секунды
Даже на такой вопрос никто ответить уже не может?

Добавлено через 23 часа 29 минут 6 секунд
Проблема решена. Тема закрыта
Yandex
Объявления
25.05.2009, 19:58     Выделить в тексте лишние пробелы между словами
Ответ Создать тему
Опции темы

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