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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 34, средняя оценка - 4.94
uto
 Аватар для uto
6 / 6 / 0
Регистрация: 07.05.2009
Сообщений: 94
19.05.2009, 05:25     Выделить в тексте лишние пробелы между словами #1
ЕЩе одна задачка из Павловской... Прошу помощи!!! Если вам лень решать всю задачу, то меня очень интересует второй пункт... Но буду рад решению всей задачи

С помощью текстового редактора создать файл, содержащий текст, длина которого не превышает 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
 Аватар для 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
 Аватар для uto
6 / 6 / 0
Регистрация: 07.05.2009
Сообщений: 94
19.05.2009, 10:06  [ТС]     Выделить в тексте лишние пробелы между словами #3
RazorQ, а причем тут двоичный режим? В задание это не указано.
accept
4838 / 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
 Аватар для 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
 Аватар для 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
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
21.05.2009, 04:02     Выделить в тексте лишние пробелы между словами #7
здесь выводятся позиции повторяющихся пробелов и их количество
Вложения
Тип файла: zip space_position.zip (443 байт, 43 просмотров)
uto
 Аватар для uto
6 / 6 / 0
Регистрация: 07.05.2009
Сообщений: 94
22.05.2009, 19:25  [ТС]     Выделить в тексте лишние пробелы между словами #8
А для чего это?
Что дадут мне позиции пробелов и их кол-ва?
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
23.05.2009, 07:16     Выделить в тексте лишние пробелы между словами #9
Код
- по нажатию произвольной клавиши поочередно выделяет в тексте лишние пробелы между словами;
- выводит текст на экран дисплея еще раз, убирая лишние пробелы между словами и начиная каждое предложение с новой строки.
ну, когда строки выводишь, в них узнаёшь позиции и, смотря как там раскрашиваешь (сразу или предварительно) раскрашиваешь с позиции на длину или выводишь с позиции на длину с другим цветом

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

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

Добавлено через 31 секунду
Цитата Сообщение от Monte-Cristo Посмотреть сообщение
fseek()
Эээ, т.е. можно двумя способами чтоли?
accept
4838 / 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
 Аватар для 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     Выделить в тексте лишние пробелы между словами
Ответ Создать тему
Опции темы

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