Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
hisnik636
0 / 0 / 1
Регистрация: 16.11.2016
Сообщений: 17
#1

Разобрать файл на форазы и комментарии - C++

16.04.2017, 23:08. Просмотров 164. Ответов 1
Метки нет (Все метки)

Всем привет, с праздником.
Вот уже 2 дня мучаюсь с задачей.

Ввод:
Дан файл . На первой строке N число в диапазоне от 0 до 100, который говорит количество фраз.
Далее(со след. строки) идет идентификатор и фраза в ковычках. Длина фразы не более 200 символов.

После фраз идут коментарии по одному слову . У комментария также есть иденификатор, который указывает к какой фразе он относится.У каждого комментария своя строка.Длина комента не более 30 символов.

Вывод:
Вывод имеет 2*N строк. Строки расположены в нарастающей последовательности по идентификаторам.

Принцип:
<N>
<ID1> "<Title1>"
...
<IDN> "<TitleN>"
<ID1> <Comment1>
...
<IDK> <CommentK>

пример:


Ввод:

4
1 "Столица России - Москва"
2 "Я люблю c++"
3 "Москва слезам не верит"
4 "у меня есть дома кот"
1 правильно
3 смотрел
2 врешь
2 верю
3 старое
1 знаю


Вывод:

Столица России - Москва //фраза 1
знаю правильно //комент к фразе 1
Я люблю c++ //фраза 2
верю врешь //комент к фразе 2
Москва слезам не верит //фраза 3
старое смотрел //комент к фразе 3
у меня есть дома кот //фраза 4
- // нет комента к фразе , поэтому -



PS. пользоваться можно только
#include <iostream>
#include <fstream>
#include "stdio.h"
#include "stdlib.h"
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.04.2017, 23:08
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Разобрать файл на форазы и комментарии (C++):

Разобрать GIF файл по пикселям и вывести в матрицу
Требуется разобрать GIF файл по пикселям и вывести на матрицу. У кого нибудь...

Сохранить листинг программы в файл, удалив из него все комментарии
Создать файл и записать в него текст любой программы, удалить из файла все...

Удалить из строки комментарии вида '/* ... */". Игнорировать вложенные комментарии.
#include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;string.h&gt; using namespace...

Удалить из строки комментарии вида '/* . */". Игнорировать вложенные комментарии
Всем привет! есть строка вида : char str=&quot;abc/*111/*def/*222*/ghi*/333*/jkl&quot;;...

Списки; разобрать код и проверить комментарии на корректность
Имеется функция для работы со связанными списками. Мне не понятно что если...

Разобрать XML-файл
Пожалуйста подскажите. Есть xml файл. &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;...

1
nd2
2828 / 2398 / 1052
Регистрация: 29.01.2016
Сообщений: 8,022
17.04.2017, 18:23 #2
Лучший ответ Сообщение было отмечено SatanaXIII как решение

Решение

Кликните здесь для просмотра всего текста
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include <iostream>
#include <cstring>
#include <fstream>
#include <cstdlib>
 
using namespace std;
 
const size_t M = 201;
const size_t m = 31;
 
struct Data
{
    size_t ind; // индекс фразы
    char str[M]; // под фразу
    char** com;  // под массив комментариев
    size_t ncom; // количество комментариев для фразы
    Data() : ind(0), com(nullptr), ncom(0)
    {}
};
 
void print(const Data* data, const int N)
{
    for (int i = 0; i < N; ++i)
    {
        cout << data[i].str << endl;
        if (data[i].ncom == 0) // если комментариев к фразе нет
            cout << "-";
        else
        {
            for (int j = data[i].ncom - 1; j >= 0; --j)
                cout << data[i].com[j] << ' ';
        }
        cout << endl;
    }
}
 
int main()
{
    ifstream fin("input.txt");
    if (!fin)
    {
        cout << "Error!" << endl;
        cin.get();
        return 0;
    }
    
    size_t N;
    fin >> N; // читаем количество фраз
 
    Data* arrData = new Data[N]; // память под N структур
    
    for (size_t i = 0; i < N; ++i) // читаем нидексы фраз и фразы в массив структур
    {
        (fin >> arrData[i].ind).get();
        fin.getline(arrData[i].str, M); 
    }
    
    size_t ind;
    while (fin >> ind) // читаем индекс комментария
    {
        for (size_t i = 0; i < N; ++i) // поиск структруры с прочитанным индексом
        {
            if (arrData[i].ind == ind) // если структура найдена
            {
                ++arrData[i].ncom;
                
                char** temp = new char*[arrData[i].ncom]; // новая память под комментарии
                size_t j;
                // если комментарии уже есть в этой структуре, то они копируются в новую память
                for (j = 0; j < arrData[i].ncom - 1; ++j)
                {
                    temp[j] = new char[m];
                    strcpy(temp[j], arrData[i].com[j]);
                }
                temp[j] = new char[m]; // выделяется память под новый комментарий
                
                // старая память под комментариями освобождается
                for (size_t k = 0; k < arrData[i].ncom - 1; ++k)
                    delete [] arrData[i].com[k];
                delete [] arrData[i].com;
 
                arrData[i].com = temp;
                
                fin >> arrData[i].com[arrData[i].ncom - 1]; // читаем новый комментарий
            }
        }
    }
 
    print(arrData, N);
 
    for (size_t i = 0; i < N; ++i)
    {
        for (size_t j = 0; j < arrData[i].ncom; ++j)
            delete [] arrData[i].com[j];
        delete [] arrData[i].com;
    }
    delete [] arrData;
    
    system("pause");
    return 0;
}


Добавлено через 12 часов 57 минут
Кликните здесь для просмотра всего текста

Без перевыделения памяти.
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#include <iostream>
#include <fstream>
#include <cstdlib>
 
using namespace std;
 
const size_t M = 201;
const size_t m = 31;
 
struct Data
{
    size_t ind; // индекс фразы
    char str[M]; // под фразу
    char** com;  // под массив комментариев
    size_t ncom; // количество комментариев для фразы
    Data() : ind(0), com(nullptr), ncom(0)
    {}
};
 
void print(const Data* data, const int N)
{
    for (int i = 0; i < N; ++i)
    {
        cout << data[i].str << endl;
        if (data[i].ncom == 0) // если комментариев к фразе нет
            cout << "-";
        else
        {
            for (int j = data[i].ncom - 1; j >= 0; --j)
                cout << data[i].com[j] << ' ';
        }
        cout << endl;
    }
}
 
int main()
{
    ifstream fin("input.txt");
    if (!fin)
    {
        cout << "Error!" << endl;
        cin.get();
        return 0;
    }
    
    size_t N;
    fin >> N; // читаем количество фраз
 
    Data* arrData = new Data[N]; // память под N структур
    
    for (size_t i = 0; i < N; ++i) // читаем индексы фраз и фразы в массив структур
    {
        (fin >> arrData[i].ind).get();
        fin.getline(arrData[i].str, M); 
    }
    
    size_t pos = fin.tellg(); // запоминаем позицию начала чтения комментариев в файле
    size_t ind;
    while ((fin >> ind).ignore(m + 2, '\n')) // читаем индекс комментария и пропускаем комментарий
    {
        for (size_t i = 0; i < N; ++i) // поиск структуры с прочитанным индексом
        {
            if (arrData[i].ind == ind) // если структура найдена
                ++arrData[i].ncom;    // увеличиваем количество комментариев по этому индексу
        }
    }
    
    fin.clear();
    fin.seekg(pos, ios::beg);
    while (fin >> ind) // читаем индекс комментария
    {
        for (size_t i = 0; i < N; ++i) // поиск структуры с прочитанным индексом
        {
            if (arrData[i].ind == ind) // если структура найдена
            {
                if (arrData[i].com == nullptr) // если память под комментарии ещё не выделена, то выделяем
                {
                    arrData[i].com = new char*[arrData[i].ncom];
                    for (size_t j = 0; j < arrData[i].ncom; ++j)
                    {
                        arrData[i].com[j] = new char[m];
                        arrData[i].com[j][0] = '\0'; // помечаем строки пустыми
                    }
                }
                
                for (size_t j = 0; j < arrData[i].ncom; ++j) // читаем комментарий в пустую строку
                {
                    if (arrData[i].com[j][0] == '\0')
                    {
                        fin >> arrData[i].com[j];
                        break;
                    }
                }
            }
        }
    }
    fin.close();
 
    print(arrData, N);
 
    for (size_t i = 0; i < N; ++i)
    {
        for (size_t j = 0; j < arrData[i].ncom; ++j)
            delete [] arrData[i].com[j];
        delete [] arrData[i].com;
    }
    delete [] arrData;
    
    system("pause");
    return 0;
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.04.2017, 18:23
Привет! Вот еще темы с решениями:

Разобрать txt-файл
Здравствуйте, форумчане! Есть некоторый код (в силу того, что он не мой,...

Не получается разобрать файл SWF
Помогите разобрать файл swf, очень интересно посмотреть на сам код программы...

Как разобрать exe файл
Народ, реально ли распаковать EXE файл написанный на delphi и вычленить из него...

Может ли for построчно разобрать файл
Нашел вот такую информацию попробовал написать простой пример ...


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

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

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