Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
2 / 2 / 0
Регистрация: 25.10.2018
Сообщений: 289

Игнорирование последней строки

18.03.2019, 14:31. Показов 1092. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вот то, что нужно:
INPUT.TXT
08:59:59: Vasya signed on
09:00:00: Privet!
09:00:31: Privet
09:00:59: Vasya signed off

OUTPUT.TXT
"Privet!" --- skazal Fedya.
"Privet," --- skazal Vasya.

А вот что делает мой код:
INPUT.TXT
08:59:59: Vasya signed on
09:00:00: Privet!
09:00:31: Privet
09:00:59: Vasya signed off

OUTPUT.TXT
"Privet!" --- skazal Fedya.
"Privet," --- skazal Vasya.
"Vasya signed off," --- skazal Fedya.

Как игнорировать последнюю строку?
Сам код:
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
62
63
64
65
66
67
68
69
#include <fstream>
#include <string>
using namespace std;
 
int main()
{
    int size; // будет содержать размер строки
    string s; // считываемая строка
    string name; // имя собеседника
    string mess; // сообщение
 
    ifstream fin;
    fin.open("INPUT.TXT");
 
    ofstream fout;
    fout.open("OUTPUT.TXT");
    
    int i = 0; // количество строк в файле 
 
    while (fin.peek() != EOF) // пока не конец файла
    {
        if (i == 0) // ЕСЛИ СТРОКА ПЕРВАЯ
        {
            getline(fin, s); // то считываем ее
            size = s.length(); // присваиваем size ее размер 
 
            for (int j = 10; j < size - 10; j++) // (j от 10, потому что в начале идет дата)
                name += s[j]; // запоминаем имя
 
            s = "";
        }
 
        else // ЕСЛИ СТРОКА НЕ ПЕРВАЯ И НЕ ПОСЛЕДНЯЯ
        {
            getline(fin, s); // то считываем ее
            size = s.length(); // присваиваем size ее размер 
 
            for (int j = 10; j < size; j++) // (j от 10, потому что в начале идет дата)
                mess += s[j]; // запоминаем сообщение
 
 
            if (mess[mess.length() - 1] == '.') // если в конце стоит точка 
                mess[mess.length() - 1] = ','; // то заменяем на запятую
 
            else if (mess[mess.length() - 1] != '!' && mess[mess.length() - 1] != '?')  // если нет ни !, ни ?
                mess += ','; // то добавляем запятую
 
 
            if (i % 2 != 0) // если строка нечетная
            {
                fout << "\"" << mess << "\" --- skazal Fedya." << endl; // выводим в файл сообщение от Феди
            }
 
            else if (i % 2 == 0) // если строка четная
            {
                fout << "\"" << mess << "\" --- skazal " << name << "." << endl; // выводим в файл сообщение от собеседника   
            }
 
            s = "";
            mess = "";
        }
        i++;
    }
 
    fin.close();
    fout.close();
 
    return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.03.2019, 14:31
Ответы с готовыми решениями:

В матрице B(N,M) поменять местами строки: первую с последней, вторую с пред последней и тд
в матрице B(N,M) поменять местами строки: первую с последней, вторую с пред последней и тд.

Удалить все символы строки до последней точки, и взять символы, идущие только после последней точки
Имеется текст примерно такого вида : attachment; filename=&quot;Subway_Surfers_1.26.0_money.apk&quot; нужно сделать чтобы в первый edit вывело...

Получить из строки все, кроме последней строки и переноса на последнюю строку
Помогите составить регулярное выражение. Использую библиотеку System.Text.RegularExpressions.Regex. Есть строка В блокноте выглядит...

8
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
18.03.2019, 15:25
А какое задание?(поподробнее)
0
2 / 2 / 0
Регистрация: 25.10.2018
Сообщений: 289
18.03.2019, 17:03  [ТС]
zayats80888, Задача:
Входные данные:
Во входном файле находится распечатка одного из диалогов по UCM. В первой строке находится сообщение о том, что собеседник Феди вошел с ним в контакт. Оно выглядит так:

ЧЧ:ММ:СС: <Имя> signed on

где ЧЧ:ММ:СС – время, когда собеседник вошел в контакт, <Имя> – имя собеседника, записанное в транслите (английскими буквами). Любое число в отображении времени занимает две цифры, например, 9 часов 43 минуты 5 секунд будет выглядеть как 09:43:05.

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

Реплика находится целиком на одной строке и состоит из метки времени, смысловой части и знака препинания конца предложения.

Метка времени имеет вид ЧЧ:ММ:СС:.

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

Знак препинания – это восклицательный знак, вопросительный знак или точка. Он может быть опущен, в этом случае подразумевается точка.

Пример реплики:

11:22:33: Ya skazal etu frazu.

Последняя строка файла имеет вид

ЧЧ:ММ:СС: <Имя> signed off

где <Имя> – имя все того же собеседника.

Объем входного файла не превышает 20 килобайт. Длина каждой строки не превосходит 250 символов.

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

Zakanchivayu tochkoi. → «Zakanchivayu tochkoi,» Eto voskhititel'no! → «Eto voskhititel'no!»

Затем поставьте пробел, три знака «–» (тире) и снова пробел, после чего выведите слово «ѕkazal» и имя собеседника, произнесшего эту реплику. После имени выведите точку. Федя запишется как «Fedya», имя его собеседника можно узнать из первой строки входного файла.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
18.03.2019, 17:12
как вариант:
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
#include <iostream>
#include <vector>
#include <string>
#include <fstream>
#include <sstream>
 
using namespace std;
 
class dialog {
    int time_format;
    string convert_postfix;
    string _subject;
    string _object;
    vector<string> _lines;
 
    void set_subject();
public:
    void set_time_format(int fmt) { time_format = fmt; }
    void set_postfix(const string& pf) { convert_postfix = pf; }
    dialog(const string& filename, const string& object);
    void convert_to_file(const string& filename);
};
 
int main()
{
    dialog d("file.txt", "Fedya");
    d.convert_to_file("output.txt");
}
 
void dialog::set_subject()
{
    stringstream ss(string(*(_lines.begin()),time_format));
    ss >> _subject;
}
 
dialog::dialog(const string & filename, const string& object): _object(object),
                                                                time_format(9),
                                                                convert_postfix("--- skazal")
{
    ifstream  in(filename.c_str());
    if (!in) {
        cerr << filename << ": file not found" << endl;
        exit(1);
    }
    string str;
    while (getline(in, str)) _lines.push_back(str);
    set_subject();
}
 
void dialog::convert_to_file(const string & filename)
{
    ofstream out(filename.c_str());
    for (size_t i(1); i < _lines.size() - 1; ++i) {
        string str(_lines[i], time_format+1);
        if (str.back() == '.') str.back() = ',';
        out << '\"' + str + '\"' + ' ' + convert_postfix << ' ';
        out << ((i % 2) ? _object : _subject) << '.' << endl;
    }
}
0
2 / 2 / 0
Регистрация: 25.10.2018
Сообщений: 289
18.03.2019, 17:19  [ТС]
zayats80888, а в моем коде можно что-то добавить/исправить?
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
18.03.2019, 17:23
Цитата Сообщение от wwmax Посмотреть сообщение
zayats80888, а в моем коде можно что-то добавить/исправить?
ну если не нужна последняя строка, то либо проверяй каждый раз её сигнатуру, либо считай все строки в вектор(как я сделал), и игнорируй её
0
2 / 2 / 0
Регистрация: 25.10.2018
Сообщений: 289
18.03.2019, 17:25  [ТС]
zayats80888, "проверяй каждый раз её сигнатуру" это как?
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
18.03.2019, 17:26
Вот сигнатура
Цитата Сообщение от wwmax Посмотреть сообщение
ЧЧ:ММ:СС: <Имя> signed off
проще через вектор
1
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5
18.03.2019, 20:41
wwmax, на регулярках
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
#include <bits/stdc++.h>
 
int main()
{
    std::string line, // считываемая строка
        name, // имя собеседника
        msg; // сообщение
 
    std::freopen("INPUT.TXT", "r", stdin);
    std::freopen("OUTPUT.TXT", "w", stdout);
    
    const std::regex msg_regex{"[0-9]{2}:[0-9]{2}:[0-9]{2}: (.*)"};
    std::regex last_msg_regex;
 
    // int i = 0; // количество строк в файле  
    for (int i = 0; std::getline(std::cin, line); ++i) // пока не конец файла
    {
        if (i == 0) // ЕСЛИ СТРОКА ПЕРВАЯ
        {
            const std::regex name_regex{"[0-9]{2}:[0-9]{2}:[0-9]{2}: (.*) signed on"};
            std::smatch name_match;
            std::regex_match(line, name_match, name_regex);
            name = name_match[1].str();
            last_msg_regex = std::regex{"[0-9]{2}:[0-9]{2}:[0-9]{2}: " + name + " signed off"};
        }
        else if (!std::regex_match(line, last_msg_regex)) // ЕСЛИ СТРОКА НЕ ПЕРВАЯ И НЕ ПОСЛЕДНЯЯ
        {
            std::smatch msg_match;
            std::regex_match(line, msg_match, msg_regex);
            msg = msg_match[1].str();
 
            if (msg[msg.length() - 1] == '.') // если в конце стоит точка
                msg[msg.length() - 1] = ',';  // то заменяем на запятую
            else if (msg[msg.length() - 1] != '!' && msg[msg.length() - 1] != '?') // если нет ни !, ни ?
                msg += ',';                                                           // то добавляем запятую
 
            std::string speaker = i & 1 ? "Fedya" : name;
            std::cout << '"' << msg << '"' << " --- skazal " << speaker << std::endl;
        }
    }
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.03.2019, 20:41
Помогаю со студенческими работами здесь

Как в текстовый файл вставить пустые строки после каждой непустой строки, кроме последней?
Есть текстовый файл в котором n-е количество строк с записями. Надо после каждой строки с записями (кроме последней) вставить пустую...

Дана квадратная матрица вычесть последнюю строку из каждой строки матрицы за исключением последней строки
Дана квадратная матрица вычесть последнюю строку из каждой строки матрицы за исключением последней строки.

Первые четыре строки массива заполняются целыми случайными числами в диапазоне 0…20, а каждый элемент последней строки должен быть равен минимальному
Решите пожалуйста!(ни фига не пойму как!) Разработать программу, в которой создается и выводится двумерный массив Х размером 5 строк на 5...

Функция: сравнение первой строки первого текстового файла и последней строки второго файла
Даны два текстовый файла, состоящие из некоторого количества строк. Написать функцию для сравнения первой строки первого файла и...

Игнорирование пустой строки
Здравствуйте! Суть моей задачи: проверка правильности ввода. Решил воспользоваться cin.getline(). Если вводить что-либо, то всё прекрасно...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru