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

ИНИ-файл. Обработка файла. Строки. (Только для умелых) - C++

Восстановить пароль Регистрация
 
Ternsip
 Аватар для Ternsip
660 / 188 / 6
Регистрация: 10.05.2012
Сообщений: 595
15.12.2012, 16:09     ИНИ-файл. Обработка файла. Строки. (Только для умелых) #1
С помощью ini-файлов в Windows записываются настройки приложений. Каждая строка ini-файла либо определяет некоторое значение, либо начинает секцию.

Строка, определяющая значение, имеет вид "key=value", где key — это название некоторого свойства, а value — его значение. По обе стороны key и value могут быть пробелы, которые стоит игнорировать.

Строка, начинающая секцию, имеет вид "[section]". Эта строка обозначает, что все последующие строки вида "key=value" определяют свойства для секции section. Разумеется, следующая строка начала секции меняет текущую секцию. В строках этого вида тоже могут встречаться незначащие пробелы (до и после любой квадратной скобки).

Cтроки, у которых первый непробел является символом ";", следует игнорировать.

Ваша задача, написать программу, которая обработает заданный корректный ini-файл и выведет его в специальном виде:
сначала следует разместить строки вида "key=value", для которых секция не определена;
затем следует разместить все секции в лексикографическом (алфавитном) порядке их названий;
внутри каждого блока, описанного в двух предыдущих пуктах, строки вида "key=value" следует упорядочить лексикографически по "key";
если существует более одной пары "key=value" с одинаковым "key" для одной секции (или с неопределенной секцией), то следует выводить только последнее вхождение (для порядка определенного входными данными);
все незначащие пробелы и переводы строк следует удалить.



Входные данные
Первая строка содержит одно целое число n (1 ≤ n ≤ 510) — количество строк в данном ini-файле.

Далее в n строках описан корректный ini-файл. Значения section, key и value состоят только из латинских букв, цифр и символов "." и "-".

Длины всех строк не превышают 255 символов и не меньше 1 символа, суммарная длина всех строк не превосходит 10000.


Выходные данные
Выведите заданный ini-файл в требуемом виде.
input.txt
11
a= 1
b=a
a = 2
; comment
[z]
1=2
[y]
2=3
[z]
2=1
[w]
output.txt
a=2
b=a
[w]
[y]
2=3
[z]
1=2
2=1
Вот мой код:
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
#include <iostream>
#include <cmath>
#include <vector>
#include <algorithm>
#include <map>
#include <string>
 
using namespace std;
 
int main(){
    freopen("input.txt", "rt", stdin);
    freopen("output.txt", "wt", stdout);
    map <pair <string, string>, string> inifile;
    int n;
    scanf("%d\n", &n);
    string str, key, value, section = "";
    for(int i = 0; i < n; i++){
        getline(cin, str);
        string temp = "";
        for (int j = 0; j < str.length(); j++){
            if (str[j] != ' ' && str[j] != '\t' && str[j] != '\n'){
                temp += str[j];
            }
        }
        if (temp[0] == ';' || temp == ""){
            continue;
        }
        if (temp[0] == '['){
            section = temp;
            inifile[make_pair(section, "")] = "";
            continue;
        }
        bool flag = 0;
        key = value = "";
        for (int j = 0; j < temp.length(); j++){
            if (flag){
                value += temp[j];
            }else{
                if (temp[j] != '='){
                    key += temp[j];
                }else{
                    flag = 1;
                }
            }
        }
        inifile[make_pair(section, key)] = value;
    }
    section = "";
    for (map <pair <string, string>, string>::iterator it = inifile.begin(); it != inifile.end(); ++it){
        if ((*it).first.first != section){
            cout << (*it).first.first << endl;
            section = (*it).first.first;
            continue;
        }
        cout << (*it).first.second << "=" << (*it).second << endl;
    }
    return 0;
}
Test.1: OK with Time 0 ms
Test.2: OK with Time 0 ms
Test.3: OK with Time 15 ms
Test.4: OK with Time 0 ms
Test.5: OK with Time 0 ms
Test.6: OK with Time 0 ms
Test.7: OK with Time 0 ms
Test.8: OK with Time 0 ms
Test.9: OK with Time 0 ms
Test.10: OK with Time 0 ms
Test.11: OK with Time 0 ms
Test.12: OK with Time 0 ms
Test.13: OK with Time 15 ms
Test.14: OK with Time 31 ms
Test.15: OK with Time 15 ms
Test.16: OK with Time 0 ms
Test.17: OK with Time 0 ms
Test.18: OK with Time 15 ms
Test.19: OK with Time 0 ms
Test.20: OK with Time 0 ms
Test.21: OK with Time 0 ms
Test.22: WA with Time 0 ms
Test.23: WA with Time 0 ms
Test.24: WA with Time 0 ms
Test.25: OK with Time 0 ms
Result - 22/25
Написал решение уже на 3 языках, но всёравно 3 теста wa. Наверное, я что то не понял. Прошу о помощи, т.к. я уже не первый раз эту задачу пытаюсь сдать, но тщетно.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.12.2012, 16:09     ИНИ-файл. Обработка файла. Строки. (Только для умелых)
Посмотрите здесь:

Записать в третий файл только те пары чисел, в которых число из первого файла меньше соответствующего числа из второго файла. C++
C++ Скопировать в файл F2 только четные строки из F1
Обработка строки из файла!?? C++
C++ Обработка строки из файла в порожденном процессе(потоке)
C++ Текстовый файл состоит из нескольких строк. Записать во второй файл последние символы из каждой строки первого файла
C++ Получить третий файл, содержащий чётные строки первого файла и нечётные строки второго файла
C++ Для заданной строки построить строку, в которой содержаться только буквы латинского алфавита исходной строки
Считать из текстового файла только определенные строки C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ternsip
 Аватар для Ternsip
660 / 188 / 6
Регистрация: 10.05.2012
Сообщений: 595
17.12.2012, 21:15  [ТС]     ИНИ-файл. Обработка файла. Строки. (Только для умелых) #2
-------------
Ternsip
 Аватар для Ternsip
660 / 188 / 6
Регистрация: 10.05.2012
Сообщений: 595
22.11.2013, 14:10  [ТС]     ИНИ-файл. Обработка файла. Строки. (Только для умелых) #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
37
38
39
40
41
42
#include <iostream>
#include <string>
#include <set>
#include <map>
 
using namespace std;
 
int main() {
    freopen("input.txt", "rt", stdin);
    freopen("output.txt", "wt", stdout);
    int n;
    cin >> n;
    scanf("\n");
    map <string, map <string, string> > sector;
    set <string> sectors;
    string sector_name = "[]";
    while(cin.peek() != EOF) {
        string origin, str = "";
        getline(cin, origin);
        for (int i = 0; i < origin.length(); ++i)
            if (isdigit(origin[i]) || isalpha(origin[i]) || 
                origin[i] == '.' || origin[i] == '-' || origin[i] == ';' ||
                origin[i] == '=' || origin[i] == '[' || origin[i] == ']')
            str += origin[i];
        if (str.size() < 1 || str[0] == ';')
            continue;
        if (str[0] == '[') {
            sector_name = str;
        } else {
            int pos = str.find("=");
            sector[sector_name][str.substr(0, pos)] = str.substr(pos + 1);
        }
        sectors.insert(sector_name.substr(1, sector_name.length()-2));
    }
    for (set <string>::iterator it_s = sectors.begin(); it_s != sectors.end(); ++it_s) {
        string str = "[" + *it_s + "]";
        if (str != "[]") cout << str << '\n';
        for (map <string, string>::iterator it = sector[str].begin(); it != sector[str].end(); ++it)
            cout << it->first << "=" << it->second << '\n';
    }
    return 0; 
 }
Yandex
Объявления
22.11.2013, 14:10     ИНИ-файл. Обработка файла. Строки. (Только для умелых)
Ответ Создать тему
Опции темы

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