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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Victorianec
20 / 20 / 6
Регистрация: 09.01.2014
Сообщений: 118
#1

Парсинг файла .cnf - C++

09.01.2014, 07:05. Просмотров 851. Ответов 24
Метки нет (Все метки)

Доброго времени суток, уважаемые форумчане.
Помогите, пожалуйста, конкретным кодом к вот такой подзадаче: нужно прочитать .cnf файл - структурированный файл представления КНФ (вроде не отличается от .txt), который внутри имеет такую структуру:
с \
с \
с строки комментариев, могут и отсутствовать
с /
с /
p cnf 10 15 //15 значит что вниз будет еще 15 строк - 15 клауз, 10 - 10 конъюнктов
1 2 0 //0 - признак конца строки
-2 4 8 0
3 7 0
...
-7 9 0

Нужно прочитать этот файл, проигнорировать/удалить комментарии, записать 10 в переменную А, 15 в переменную В, а каждую следующую строку в двумерный массив int из 15 строк и не суть важно скольких столбцов (их количество в каждой строке может быть разное).
Очень надеюсь на вашу помощь - это нужно для диплома, который мне через 5 дней защищать((
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.01.2014, 07:05     Парсинг файла .cnf
Посмотрите здесь:

Парсинг файла - C++
Загружаю файл в string, строка в файле только одна, так что масив ненужен. В чем задача стоит? Содержимое файла такое: {"параметр_1":...

Парсинг файла - C++
Вот открываю через FILE*, файл ввида "test" { "test1" "test1_1" "test2" "test2_1" "test3" "test3_1" ...

Парсинг строк из файла - C++
Имеется файл с содержанием 3 Text Text2 Text3

Парсинг текстового файла в map - C++
Здравствуйте! Подскажите, пожалуйста, как парсить текстовый файл в map. Например, есть файл, в котором записано следующее: 1 a 2 b 3...

typdef struct + парсинг из файла - C++
Собственно такая задача : Надо создать структуру, на основе чтения из файла. От вас готового когда не прошу, если можно - просты ссылки...

Парсинг из файла и суммирование столбца - C++
В файле "data.txt" записаны 2 столбца чисел. Написать функцию, которая находит сумму чисеол во 2 столбце. (столбцы разделены ' ') Заранее...

Парсинг файла игнорирует числа - C++
Всем добрый день. Пытаюсь прочитать данные из файла 3D модели в формате OBJ. bool L_ObjData::LoadFromFile(string FileName) { ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.01.2014, 11:45     Парсинг файла .cnf #16
Цитата Сообщение от Victorianec Посмотреть сообщение
Мне для дальнейшей обработки (написания компактного ГА) нужно чтобы каждое значимое число строки было отдельно и доступно. Поэтому мне нужен двумерный массив.
А в одномерном массиве разве какие-то числа будут недоступны?
Victorianec
20 / 20 / 6
Регистрация: 09.01.2014
Сообщений: 118
09.01.2014, 11:54  [ТС]     Парсинг файла .cnf #17
Цитата Сообщение от alsav22 Посмотреть сообщение
А в одномерном массиве разве какие-то числа будут недоступны?
Доступ к двумерному массиву для меня будет гораздо удобнее. Если именно это вызывает сложность - я буду рад хотя бы любому результату. Если вы спрашиваете более из любопытства - тогда объясню на конкретном примере: каждая строчка - это клауза КНФ, к примеру, первые сколько-то там строк в которых только по одному конъюнкту найти и обработать не сложно, дальше когда в одной строке будет 2-3 конъюнкта мне нужно будет их вместе обрабатывать (по правилам булевой алгебры 1 или 2 или 3) и "достучаться" к ним по одному индексу будет гораздо удобнее, чем хранить для каждого, к какому конъюнкту он принадлежит или с какими другими связан логической связью.
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.01.2014, 12:00     Парсинг файла .cnf #18
gazlan, я только не понял, почему одномерный массив должен быть размера 70139 * 228634? Или описание ТС неверно (или я неправильно понял).
p cnf 70139 228634
Victorianec, что эти числа обозначают?

Добавлено через 3 минуты
Цитата Сообщение от Victorianec Посмотреть сообщение
Если вы спрашиваете более из любопытства
Любопытство тут не при чём. Сделать здесь чтение в одномерный массив - элементарно, в двумерный - уже сложнее.

Добавлено через 1 минуту
Понял, что нужен двумерный.
Victorianec
20 / 20 / 6
Регистрация: 09.01.2014
Сообщений: 118
09.01.2014, 12:01  [ТС]     Парсинг файла .cnf #19
Victorianec, что эти числа обозначают?
Изначально вы поняли правильно, 228634 - количество клауз - строк которые будут ниже, каждая уникальна; 70139 - количество литералов - чисел которые встречаются внутри клауз, могут повторяться, их количество на массив не влияет и его нужно только один раз вычитать в переменную, больше никаких действий с ним не нужно. Количество чисел в строке не более 3. Я, кажется, даже 4 не встречал
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.01.2014, 12:02     Парсинг файла .cnf #20
Цитата Сообщение от Victorianec Посмотреть сообщение
каждая строчка - это клауза КНФ
Если каждая строчка - это клауза, тогда, наверное, наоборот (по сравнению с описанием в первом посте):
70139 клауз, 228634 чисел? Строк(клауз) не может же быть меньше, чем чисел?
Victorianec
20 / 20 / 6
Регистрация: 09.01.2014
Сообщений: 118
09.01.2014, 12:07  [ТС]     Парсинг файла .cnf #21
Цитата Сообщение от alsav22 Посмотреть сообщение
Если каждая строчка - это клауза, тогда, наверное, наоборот (по сравнению с описанием в первом посте):
70139 клауз, 228634 чисел? Строк не может же быть меньше, чем чисел?
Нет, я не ошибся. Числа в клаузах повторяются, т.е. могут встречаться в 5-10 клаузах, а так же еще в 5-10 с отрицанием.
На самом деле каждое число это индекс элемента вектора, длинной 70139, а каждый элемент это 0 и 1. Но это важно станет только после считывания
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.01.2014, 13:55     Парсинг файла .cnf #22
Один из вариантов:
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
 
int main ()
{
    const int N = 4; // максимально количество чисел (с 0) в строке файла
    
    ifstream fin("gus_md5_16.cnf");
    if (!fin) cout << "Error fin!" << endl;
    else
    {
        string str;
        while (fin >> str)
        {
            if (str != "p")
            {
                fin.ignore(255, '\n');
                continue;
            }
            else
                fin >> str;
                if (str != "cnf")
                {
                    fin.ignore(255, '\n');
                    continue;
                }
                else
                {
                   unsigned int cnt_all = 0; // всего считанных чисел (вместе с 0)
                   unsigned int cnt = 0; // количество считанных чисел без 0
                   int A, B;
                   
                   fin >> A >> B;
               
                   int** arr = new int*[B];
                   for (int i = 0; i < B; ++i)
                       arr[i] = new int[N];
               
                   int n;
                   int i = 0, j = 0;
                   while (fin >> n)
                   {
                        arr[i][j] = n;
                        ++cnt_all;
                        if (n != 0) ++cnt;
                        ++j;
                        if (j == N || n == 0)
                        {
                            ++i;
                            j = 0;
                        }
                    }
 
                    cout << "Successful!\n" << endl;
                    cout << "cnt_all = " << cnt_all << endl;
                    cout << "cnt = " << cnt << endl;
                    
                    // вывод, для проверки, чисел, считанных из последней строки файла
                    for (int i = 0; i < N; ++i)
                        cout << arr[B - 1][i] << ' ';
                    cout << endl;
                }
          }
    }
    
    cin.get();
    return 0;
}

Насчёт колличества строк (228634), ограничено только размером памяти, которую ОС может выделить приложению.

Добавлено через 3 минуты
4, в двух местах, забыл заменить на N (исправил). Можно ещё сделать выход из чтения чисел, если строк в файле вдруг окажется больше, чем B (чтобы за границу массива не выйти):
C++
1
2
3
4
5
6
7
8
9
10
11
12
while (fin >> n && i < B) // добавленно условие
{
        arr[i][j] = n;
        ++cnt_all;
        if (n != 0) ++cnt;
        ++j;
        if (j == N || n == 0)
        {
             ++i;
             j = 0;
        }
}
gazlan
3130 / 1905 / 285
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 1
09.01.2014, 14:14     Парсинг файла .cnf #23
Цитата Сообщение от alsav22 Посмотреть сообщение
Сделать здесь чтение в одномерный массив - элементарно, в двумерный - уже сложнее.
Это одно и то же: и в плане доступа, и с точки зрения размещения в памяти. В C массивы хранятся построчно, поэтому и формула доступа к произвольному (i,j) выписана через размер строки.
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.01.2014, 14:20     Парсинг файла .cnf #24
Я имел ввиду сложнее, если под каждую строку массива выделять память, по количеству чисел в строке, а не фиксированный размер.

Добавлено через 2 минуты
Victorianec, ещё уточнение по коду. Если делать вывод, для проверки, именно считанной последней строки из файла:
C++
1
2
3
4
5
for (int j = 0; j < N; ++j)
{
    cout << arr[B - 1][j] << ' ';
    if ( arr[B - 1][j] == 0) break;
}
В коде из 22 поста, вывод последней строки массива, что не страшно, но не одно и тоже.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.01.2014, 21:00     Парсинг файла .cnf
Еще ссылки по теме:

Считывание и парсинг данных с текстового файла - C++
Как правильно считать такую строку с етого файла? 3 circle 3.0 3.0 5.0 square 0.0 0.0 0.0 4.0 4.0 4.0 4.0 0.0 triangle 3.0 3.0 0.0...

Чтение юникодного файла и парсинг строки - C++
Не удается нормально считать файл. значения читаются с нуль пробелом, как их распарсить и сконвертировать в обычные типы данных?? вот...

Парсинг - C++
Всем доброго времени суток. Только начал изучать c++ и нужна помощь. Есть код, нужно сделать парсинг. Не понимаю , что это и как его...

Парсинг - C++
Привет всем вообщем нужно удачно спарсить данные (gold, money, fuel, lvl, model) вид ответа хоть и xml но данные к сожалению находятся не в...

Парсинг - C++
Привет всем ) Есть небольшая проблема например имеется переменная String t = '&lt;img src=&quot;http://site.ru/u3124123/d_hwre2.jpg&quot;/&gt;...


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

Или воспользуйтесь поиском по форуму:
Victorianec
20 / 20 / 6
Регистрация: 09.01.2014
Сообщений: 118
09.01.2014, 21:00  [ТС]     Парсинг файла .cnf #25
alsav22, Спасибо огромное!
Yandex
Объявления
09.01.2014, 21:00     Парсинг файла .cnf
Ответ Создать тему
Опции темы

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