Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
25 / 22 / 23
Регистрация: 18.05.2014
Сообщений: 130
1

Отформатировать текст: каждое предложение с новой строки, между словами - по одному пробелу

30.11.2014, 14:03. Просмотров 4320. Ответов 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
39
40
41
42
43
44
45
46
47
48
49
#include <iostream>
#include  <fstream>
using namespace std;
char read();
int main()
{
    setlocale(0,"");
    int k = 81;
    int len;
    read();
    cout<< "\n";
system("pause");
return 0;
}
char read()
{
    ifstream fin("C:\\Users\\Администратор\\Desktop\\TextFile1.txt");  // создание потока (объекта) для ввода 
    // связывание потока с файлом и открытие файла для чтения
    if (!fin)  // если ошибка открытия файла, то
    {
        cout << "FileError" << endl;  // вывод сообщения об ошибке
        return 1;  // завершение работы программы
    }
    fin.seekg(0, ios::end); //установка текущей позиции чтения на конец файла
    int   len = fin.tellg();  // метод tellg определяет длину файла
    cout << "len = " << len << endl; // вывод значения длины файла
    char   *buf = new   char[len + 1]; // создание  массива символов
    fin.seekg(0, ios::beg); //установка текущей позиции чтения на начало файла
    fin.read(buf, len); // считывание из файла len символов в символьный массив buf
    cout << "buf = " << endl << buf << endl << endl; // вывод строки buf для контроля
    buf[len] = '\0';  // запись нуль-символа в конец символьного массива
    int  n = 0; // позиция начала текущего предложения
    int  i = 0; // для просмотра массива
    int  j = 0; // для вывода предложения
 
    while (buf[i])  // цикл по i до конца буфера
    {
        if (buf[i] == '?' || buf[i] == '.' || buf[i] == '!')// если очередной символ == '?','!',или '.'
        {
            for (j = n; j <= i; j++)  // цикл по j от начала текущего предложения  до знака '?'
                cout << buf[j]; // вывод j-того символа
            n = i + 1;  // текущее положение - на символ после предложения
            cout << "\n";
        }
        i++;  // переход к следующему символу
    }
    cout << endl;  // перевод строки
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.11.2014, 14:03
Ответы с готовыми решениями:

Отредактировать предложение, удаляя из него лишние пробелы, оставляя по одному пробелу между словами
Отредактировать предложение, удаляя из него лишние пробелы, оставляя по одному пробелу между...

Вывод текста на экран дисплея, удаляя лишние пробелы между словами и начиная каждое предложение с новой строки
С помощью текстового редактора создать файл, который содержит текст, длина которого не превышает...

Отредактировать предложение, удаляя из него лишние пробелы, оставляя только по одному пробелу между словами
Отредактировать предложение, удаляя из него лишние пробелы, оставляя только по одному пробелу между...

Сжать текст, оставив между словами по одному пробелу
Дан текст 30 символов. Сжать текст, оставив между словами по одному пробелу.

5
6918 / 5983 / 2710
Регистрация: 14.04.2014
Сообщений: 25,504
30.11.2014, 14:31 2
Добавь внутрь дополнительное условие и цикл для пропуска всех пробелов кроме первого.
0
25 / 22 / 23
Регистрация: 18.05.2014
Сообщений: 130
30.11.2014, 15:35  [ТС] 3
А можно отдельной функцией?

Добавлено через 51 минуту
и как это осуществить?
0
4455 / 2074 / 263
Регистрация: 01.03.2013
Сообщений: 5,509
Записей в блоге: 22
30.11.2014, 17:43 4
Поискать в библиотечных или написать свою функцию strreplace, которая заменяет одну последовательность символов в строке на другую. И гонять многократно весь текст через нее с заменой " " на " " пока исходная подстрока встречается.
0
6918 / 5983 / 2710
Регистрация: 14.04.2014
Сообщений: 25,504
30.11.2014, 18:50 5
Не нужна тут функция, ты же знаки конца предложения без функции проверяешь. Вот также и с пробелами + цикл для пропуска.
0
25 / 22 / 23
Регистрация: 18.05.2014
Сообщений: 130
01.12.2014, 19:02  [ТС] 6
Препод сказал "задача должна состоять как минимум из 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
27
28
29
30
31
32
33
34
35
36
#include <iostream>
#include  <fstream>
using namespace std;
int main()
{
    setlocale(0,"rus");
    ifstream fin("C:\\Users\\Администратор\\Desktop\\TextFile1.txt");  // создание потока (объекта) для ввода 
    // связывание потока с файлом и открытие файла для чтения
    if (!fin)  // если ошибка открытия файла, то
    {
        cout << "FileError" << endl;  // вывод сообщения об ошибке
        return 1;  // завершение работы программы
    }
    fin.seekg(0, ios::end); //установка текущей позиции чтения на конец файла
    int   len = fin.tellg();  // метод tellg определяет длину файла
    cout << "len = " << len << endl; // вывод значения длины файла
    char   *buf = new   char[len + 1]; // создание  массива символов
    fin.seekg(0, ios::beg); //установка текущей позиции чтения на начало файла
    fin.read(buf, len); // считывание из файла len символов в символьный массив buf
    cout << "buf = " << endl << buf << endl << endl; // вывод строки buf для контроля
    buf[len] = '\0';  // запись нуль-символа в конец символьного массива
    int  n = 0; // позиция начала текущего предложения
    int  i = 0; // для просмотра массива
    int  j = 0; // для вывода предложения
 
    for (int i = 0; i <= strlen(buf); i++)  // Для каждого i пока i меньше длинны строки buf прибавлять по 1 пробежать по всей строке
    if ((buf[i] == ' ') && (buf[i + 1] == ' ')) // если текущий элемент и следующий за ним пробел
    { // тогда
        for (int j = i; j <= strlen(buf); j++) // пробегаем по строке и 
            buf[j] = buf[j + 1];     // смещаем символы строки на 1 назад
        i = i - 1;  // так как мы сместили всю строку назад то и курсор цикла смещаем 
    }
    cout << "buf = " << endl << buf << endl << endl;
    system("pause");
    return 0;
}
Вот я сделал отдельно(работает!), НО 1) как соединить эти решения 2)как вынести все циклы ф функции ,чтобы главная программа состояла только из набора вызовов функций.

Добавлено через 4 часа 34 минуты
Народ спасибо разобрался!
Вот код,если кому вдруг будет нужен

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
57
58
59
60
61
#include <iostream>
#include  <fstream>
#include<iomanip>
using namespace std;
float space(char *buf);
float red(char *buf);
int  n = 0; // позиция начала текущего предложения
int  i = 0; // для просмотра массива
int  j = 0; // для вывода предложения
int main()
{
    setlocale(0,"rus");
    ifstream fin("C:\\Users\\Администратор\\Desktop\\TextFile1.txt");  // создание потока (объекта) для ввода 
    // связывание потока с файлом и открытие файла для чтения
    if (!fin)  // если ошибка открытия файла, то
    {
        cout << "FileError" << endl;  // вывод сообщения об ошибке
        return 1;  // завершение работы программы
    }
    fin.seekg(0, ios::end); //установка текущей позиции чтения на конец файла
    int   len = fin.tellg();  // метод tellg определяет длину файла
    cout << "len = " << len << endl; // вывод значения длины файла
    char   *buf = new   char[len + 1]; // создание  массива символов
    fin.seekg(0, ios::beg); //установка текущей позиции чтения на начало файла
    fin.read(buf, len); // считывание из файла len символов в символьный массив buf
    cout << "buf = " << endl << buf << endl << endl; // вывод строки buf для контроля
    buf[len] = '\0';  // запись нуль-символа в конец символьного массива
    red(buf);
    ofstream fout("C:\\Users\\Администратор\\Desktop\\TextFile2.txt");
    //Можно вывести в файл
    system("pause");
    return 0;
}
float space(char *buf)
{
    for (int i = 0; i <= strlen(buf); i++)  // Для каждого i пока i меньше длинны строки buf прибавлять по 1 пробежать по всей строке
    if ((buf[i] == ' ') && (buf[i + 1] == ' ')) // если текущий элемент и следующий за ним пробел
    { // тогда
        for (int j = i; j <= strlen(buf); j++) // пробегаем по строке и 
            buf[j] = buf[j + 1];     // смещаем символы строки на 1 назад
        i = i - 1;  // так как мы сместили всю строку назад то и курсор цикла смещаем 
    }
    return 0;
}
float red(char *buf)
{
    space(buf);
    while (buf[i])  // цикл по i до конца буфера
    {
        if (buf[i] == '?' || buf[i] == '.' || buf[i] == '!')// если очередной символ == '?','!',или '.'
        {
            for (j = n; j <= i; j++)  // цикл по j от начала текущего предложения  до знака '?'
                cout << buf[j]; // вывод j-того символа
            n = i + 1;  // текущее положение - на символ после предложения
            cout << "\n";
        }
        i++;  // переход к следующему символу
    }
    cout << endl;  // перевод строки
    return 0;
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.12.2014, 19:02

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Сжать текст, оставив между словами по одному пробелу
Дан текст 30 символов. Сжать текст, оставив между словами по одному пробелу.

Ввести текст.Отредактировать текст,удаляя из него лишние пробеоы,оставляя только по одному пробелу между словами
Ввести текст.Отредактировать текст,удаляя из него лишние пробеоы,оставляя только по одному пробелу...

Удалить из строки лишние пробелы, оставляя между словами только по одному пробелу
Удалить из строки лишние пробелы, оставляя между словами только по одному пробелу

Удалить повторяющиеся пробелы между отдельными словами строки (оставляя по одному пробелу)
Введите предложение, слова в котором разделены пробелами и в конце которого стоит точка. Удалите...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.