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

Считывние вектора структур из файла .txt - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.93
НикиЧ
0 / 0 / 0
Регистрация: 05.08.2010
Сообщений: 12
06.08.2010, 15:05     Считывние вектора структур из файла .txt #1
Всем доброго времени суток. При выполнении задания, у меня возникла такая проблема:
Имеется класс, одно из полей - вектор стуктур. Также дан текстовой файл, в каждой строке которого должен быть записа объект данного класса, т.е тип строчки в файле имеет вид: char ...[] char...[] char ....[] vector<char ...[] int> (количество элементов вектора неизвестно (каждый раз разное)). Проблема в том, что я не знаю как считывать разное количество структур.
Вот тут мои наработки:

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
#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <string.h>
#include <vector>
 
using namespace std;
 
struct prod
{
    char npr[256];
    int cpr;
};
 
class sklad
{
public:
    char nomer[256];
    char name[256];
    char pers[256];
    vector<prod> pr;
 
    sklad *next;
};
 
typedef sklad* Psklad;       
 
Psklad datebase;              
//------------------------ФУНКЦИЯ ПЕЧАТИ МЕНЮ-----------------------------------
int printMenu()
{
    cout << "Выберите действие:" << endl <<
        "1: ....................." << endl <<
        "2: ......................." << endl <<
        "3: ......................." << endl <<
        "4: .............................." << endl <<
        "5: Выход" << endl;
    
    bool truth = false;
    int action;
    while(!truth)
    {   
        cout << "Ваш выбор: ";
        cin >> action;
        if((action >= 1) && (action <= 5))
            truth = true;
        else
        {
            cout << "Нет такого действия" << endl;
            return 1;
        }
    }
 
    return action;
}
 
 
//----------------------ДОБАВЛЕНИЕ НОВОЙ ЗАПИСИ-----------------------------------------------
void addSklad(Psklad newSklad)
{
    newSklad->next = NULL;
 
    if(!datebase)
    {
        datebase = newSkladr;
    }else
    {
        Psklad pointer = datebase;
        while(pointer->next != NULL)
            pointer = pointer->next;
 
        pointer->next = newSklad;
    }
}
 
 
//------------------------------------ЧТЕНИЕ ФАЙЛА -----------------------------------------------
void readDatebase()
{   int i=0;
    FILE *fdatebase = fopen("datebase.txt", "r");
    if(!fdatebase)
    {
        cout << "Нет базы данных" << endl;
        Sleep(5000);
        exit(0);
    }
 
    while(!feof(fdatebase))
    {
        Psklad tempRec = new sklad;
        fscanf(fdatebase, "%s ", &tempRec->nomer);
        fscanf(fdatebase, "%s ", &tempRec->name);
        fscanf(fdatebase, "%s ", &tempRec->pers);
        ????????????????????????????????????????????????????????????????????????????????
            fscanf(fdatebase, "%s ", &tempRec->pr[i].npr);
            fscanf(fdatebase, "%d ", &tempRec->pr[i].cpr);
        ????????????????????????????????????????????????????????????????????????????????
        
            
        addSklad(tempRec);
    }
 
    fclose(fdatebase);
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Dzhej-Dzhej
Заблокирован
06.08.2010, 15:36     Считывние вектора структур из файла .txt #2
используй что-то типа XML придумай теги, отдельный тег для конца структуры, два вложенных while(на eof и на конец структуры) и все
ну и switch для обработки тегов
НикиЧ
0 / 0 / 0
Регистрация: 05.08.2010
Сообщений: 12
06.08.2010, 15:41  [ТС]     Считывние вектора структур из файла .txt #3
А можно с примером? Или хотя бы подробным описанием, а то я ещё "очень новичок".
Я еще думал сделать вложенный цикл while с условием "до конца строки файла", но не знаю как это записать.
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
06.08.2010, 15:56     Считывние вектора структур из файла .txt #4
Цитата Сообщение от Dzhej-Dzhej Посмотреть сообщение
используй что-то типа XML придумай теги, отдельный тег для конца структуры, два вложенных while(на eof и на конец структуры) и все
ну и switch для обработки тегов
на парсинг документа времени больше уйдет, чем на чтение

Почему бы не воспользоваться fwrite/fread. Структура же имеет постоянный размер. Вот и пишите в файл подряд. Потом читайте до конца файла. Все просто, если конечно в файле ничего кроме не может быть.
НикиЧ
0 / 0 / 0
Регистрация: 05.08.2010
Сообщений: 12
07.08.2010, 11:28  [ТС]     Считывние вектора структур из файла .txt #5
Цитата Сообщение от fasked Посмотреть сообщение
Все просто, если конечно в файле ничего кроме не может быть
В файле кроме структур есть и другие данные.

Добавлено через 19 часов 22 минуты
Народ! Проблемя все еще актуальна!
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
07.08.2010, 12:04     Считывние вектора структур из файла .txt #6
Приведи пример входного файла, и в нем для отдельной строчки конкретно распиши, какое значение должно присваиваться каждому полю твоего класса.

Добавлено через 5 минут
А еще напиши, что у тебя хранит каждое поле структуры и файла. А то, к примеру, непонятно, что и зачем хранится у тебя в переменной cpr структуры prod.
НикиЧ
0 / 0 / 0
Регистрация: 05.08.2010
Сообщений: 12
07.08.2010, 13:28  [ТС]     Считывние вектора структур из файла .txt #7
Цитата Сообщение от Nameless One Посмотреть сообщение
А еще напиши, что у тебя хранит каждое поле структуры и файла. А то, к примеру, непонятно, что и зачем хранится у тебя в переменной cpr структуры prod.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct prod
{
        char npr[256];            // здесь хранится название продукции, которая наход. на складе
        int cpr;                     // здесь цена этой продукции на этом складе
};
 
class sklad
{
public:
        char nomer[256];              // номер склада
        char name[256];               // название склада
        char pers[256];                 // инфа о персонале (необязательно)
        vector<prod> pr;
 
        sklad *next;
};

Цитата Сообщение от Nameless One Посмотреть сообщение
Приведи пример входного файла
Код
номер 	название 	инфа_о_персонале	продукция

001	Склад1		28_человек		хлеб 10 молоко 20 
............................................................
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
07.08.2010, 14:11     Считывние вектора структур из файла .txt #8
Я бы сделал так:
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
#include <iostream>
#include <string>
#include <pair>
#include <vector>
#include <fstream>
#include <sstream>
 
struct record
{
    size_t                                       id; // Номер
    std::string                                  name; // Имя
    std::string                                  pers; // Инфа о персонале
 
    // Собственно злосчастный вектор
    // Содержит пары член first - товар,  член  second - цена
    std::vector<std::pair<std::string, size_t> > prod; 
 
 
    record(                        // Определим конструктор для удобства
         size_t _id, 
         const std::string& _name,
         const std::string& _pers,
         const std::vector<std::pair<std::string, size_t> >& _prod)
            : id(_id), name(_name), pers(_pers), prod(_prod) { }
};
 
int main()
{
    std::vector<record>   db; //Вместо массива записей, ИМХО, лучше использовать тот же вектор
    std::string  filename("dataBase.txt");
    std::ifstream ifs(filename.c_str());
    if(!ifs)
    {
        std::cerr << "Error opening file \"" << filename << "\" for input" << std::endl;
        return EXIT_FAILURE;
    }
    std::string line;
    while(std::getline(ifs, line))
    {
        if(!ifs)
        {
            std::cerr << "Error reading from file \"" << filename << "\"" << std::endl;
            return EXIT_FAILURE;
        }
        std::istringstream iss(line);
        size_t id;
        iss >> id;
        std::string name;
        iss >> name;
        std::string pers;
        iss >> pers;
        std::vector<std::pair<std::string, size_t> > prod;
        std::string npr;
        size_t cpr;
        // Считали номер, название, инфу,
        // остальные данные относятся к продукции
        while(iss >> npr >> cpr) // Цикл "пока есть что считывать"
              prod.push_back(std::pair<std::string, size_t>(npr, cpr));
        db.push_back(record(id, name, pers, prod));
    }
    // А вот здесь у нас (теоретически) уже полностью сформированный вектор записей db
    return EXIT_SUCCESS;
}
Код писался без компилятора под рукой, так что он может (и скорее всего) содержит мелкие ошибки. Но думаю, принцип ты понял.

Добавлено через 5 минут
ЗЫ. Т.к. как и число записей в базе, так и число записей о продукции заранее неизвестно, целесообразно заменить в программе все контейнеры vector на контейнеры deque (т.к. они менее затратны при частом расширении).
НикиЧ
0 / 0 / 0
Регистрация: 05.08.2010
Сообщений: 12
07.08.2010, 14:35  [ТС]     Считывние вектора структур из файла .txt #9
Конструктор структуры?....
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
07.08.2010, 14:39     Считывние вектора структур из файла .txt #10
Структуры от классов в С++ отличаются только методом доступа к членам по умолчанию. Все члены структуры по умолчанию являются публичными (public), члены конструктора - закрытыми (private). В остальном они идентичны.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
07.08.2010, 14:40     Считывние вектора структур из файла .txt #11
НикиЧ, А что в этом необычного? В С++ структура - тот же класс, кроме доступа по умолчанию.
Опоздал)
НикиЧ
0 / 0 / 0
Регистрация: 05.08.2010
Сообщений: 12
07.08.2010, 14:43  [ТС]     Считывние вектора структур из файла .txt #12
Цитата Сообщение от Nameless One Посмотреть сообщение
Структуры от классов в С++ отличаются только методом доступа к членам по умолчанию. Все члены структуры по умолчанию являются публичными (public), члены конструктора - закрытыми (private). В остальном они идентичны.
Понятно... То есть это будет аналогично такому:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class record
{
    public:
    size_t                                       id; // Номер
    std::string                                  name; // Имя
    std::string                                  pers; // Инфа о персонале
 
    // Собственно злосчастный вектор
    // Содержит пары член first - товар,  член  second - цена
    std::vector<std::pair<std::string, size_t> > prod; 
 
 
    record(                        // Определим конструктор для удобства
         size_t _id, 
         const std::string& _name,
         const std::string& _pers,
         const std::vector<std::pair<std::string, size_t> >& _prod)
            : id(_id), name(_name), pers(_pers), prod(_prod) { }
};
Добавлено через 1 минуту
И еще вопрос: что такое iss? Просто нигде раньше не встречал и сейчас даже в справочнике найти не могу.
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
07.08.2010, 14:44     Считывние вектора структур из файла .txt #13
Цитата Сообщение от НикиЧ Посмотреть сообщение
Понятно... То есть это будет аналогично такому:
Совершенно верно.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
07.08.2010, 14:45     Считывние вектора структур из файла .txt #14
НикиЧ, Строковый поток.
НикиЧ
0 / 0 / 0
Регистрация: 05.08.2010
Сообщений: 12
07.08.2010, 14:46  [ТС]     Считывние вектора структур из файла .txt #15
Цитата Сообщение от Lavroff Посмотреть сообщение
НикиЧ, А что в этом необычного?
понимаешь, я учусь на специальности, которая очень поверностно соприкасается с программированием и за С++ я взялся только пару недель назад...
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
07.08.2010, 14:48     Считывние вектора структур из файла .txt #16
Цитата Сообщение от НикиЧ Посмотреть сообщение
И еще вопрос: что такое iss? Просто нигде раньше не встречал и сейчас даже в справочнике найти не могу.
Объект класса istringstream - строкового потока ввода. Инициализируешь его строкой и работаешь с ним так же, как с консольными (std::istream) и файловыми (std::ifstream) потоками.
НикиЧ
0 / 0 / 0
Регистрация: 05.08.2010
Сообщений: 12
07.08.2010, 14:54  [ТС]     Считывние вектора структур из файла .txt #17
Nameless One, Lavroff, благодарю за помощь. Идею уловил дальше попробую сам разобраться.
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
07.08.2010, 15:02     Считывние вектора структур из файла .txt #18
Вот еще в догонку пример для stringstream Как перевести число с плавающей точкой в строку.
Lаmer
7 / 7 / 4
Регистрация: 24.03.2010
Сообщений: 25
07.08.2010, 16:24     Считывние вектора структур из файла .txt #19
Цитата Сообщение от Nameless One Посмотреть сообщение
Вот еще в догонку пример для stringstream Как перевести число с плавающей точкой в строку.
C++
1
#define dbg(EXP) std::cout << std::boolalpha << #EXP ": " << (EXP) << std::endl
Как это работает?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.08.2010, 16:26     Считывние вектора структур из файла .txt
Еще ссылки по теме:

Как считать массив структур из файла txt C++
Сортировка вектора структур C++
Чтение вектора структур из файла C++

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
07.08.2010, 16:26     Считывние вектора структур из файла .txt #20
Lаmer, Макрос с параметром.
# печать строки. Следовательно мы печатаем строку, а потом, через двоеточие, значение в булевой форме, ежели оно есть конечно.
Yandex
Объявления
07.08.2010, 16:26     Считывние вектора структур из файла .txt
Ответ Создать тему
Опции темы

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