Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
0 / 0 / 0
Регистрация: 05.08.2010
Сообщений: 12

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

06.08.2010, 15:05. Показов 3612. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток. При выполнении задания, у меня возникла такая проблема:
Имеется класс, одно из полей - вектор стуктур. Также дан текстовой файл, в каждой строке которого должен быть записа объект данного класса, т.е тип строчки в файле имеет вид: 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);
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.08.2010, 15:05
Ответы с готовыми решениями:

Чтение вектора структур из файла
struct TRANSACTIONS { unsigned long long sender; unsigned long long receiver; unsigned long long amount; } ... ...

Чтение вектора структур из бинарного файла
Есть функция записи и чтения: void fout(vector&lt;struc&gt;&amp;arr, string path) { int a, b; ofstream fl(path, ios::binary); ...

Как считать массив структур из файла txt
#include &quot;stdafx.h&quot; #include &lt;fstream&gt; #include &lt;iostream&gt; #include &lt;cstring&gt; using namespace std; struct slug { char...

27
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
08.08.2010, 05:37
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Lаmer Посмотреть сообщение
Как это работает?
Оператор препроцессора # преобразует переданный макросу идентификатор в строковую константу.
1
0 / 0 / 0
Регистрация: 05.08.2010
Сообщений: 12
15.08.2010, 12:08  [ТС]
Я очень извиняюсь, но есть еще момент, который я никак не могу понять. Допустим заполнил из файла нужный вектор, как мне показал Nameless One :

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
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;
}
Дальше я что-то делаю с этим вектором (удаляю элементы, добавляю, .... вобщем не суть):
C++
1
2
................
...............
И вот, как мне перезаписать исходный файл? То есть вместо исходного вектора записать получившийся?
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
15.08.2010, 12:31
  1. Закрой поток ввода ifs (ifs.close());
  2. Открой поток вывода std::ofstrem ofs("dataBase.txt");
  3. И выводи в него информацию
0
0 / 0 / 0
Регистрация: 05.08.2010
Сообщений: 12
15.08.2010, 12:50  [ТС]
Это понятно...
Цитата Сообщение от Nameless One Посмотреть сообщение
И выводи в него информацию
Но вот каким образом? Пробовал разными способами, например так:
C++
1
2
for(std::vector<record>::iterator ix=db.begin(); ix!=db.end(); ix++)
        ofs<<*ix<<"  ";
не получается.
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
15.08.2010, 13:03
Ты не сможешь вывести всю структуру в файл (если, конечно, ты не перегрузил для нее оператор вывода), поэтому, нужно выводить все ее элементы по одному:
C++
1
2
3
4
5
6
7
8
9
10
for(std::vector<record>::const_iterator it=db.begin(); it != db.end(); ++it, ofs << std::endl)
{
    ofs << it->id << " "
         << it->name << " "
         << it->pers;
    for(std::vector<std::pair<std::string, size_t>::const_iterator it1 = it->prod.begin();
         it1 != it->prod.end();
         ++it1)
        ofs <<  " " << it1->first << " " << it1->second;
}
0
0 / 0 / 0
Регистрация: 05.08.2010
Сообщений: 12
15.08.2010, 13:17  [ТС]
Пишет, что "error C2039: const_iterator: не является членом "std:: pair<_Ty1,_Ty2>"", "error C2065: const_iterator: необъявленный идентификатор" и другие ошибки (которые вытекают из этих)
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
15.08.2010, 13:20
У меня в 6 строке ошибка: пропустил закрывающую скобку. Надо так:
C++
1
2
3
4
5
6
7
8
9
10
for(std::vector<record>::const_iterator it=db.begin(); it != db.end(); ++it, ofs << std::endl)
{
    ofs << it->id << " "
         << it->name << " "
         << it->pers;
    for(std::vector<std::pair<std::string, size_t> >::const_iterator it1 = it->prod.begin();
         it1 != it->prod.end();
         ++it1)
        ofs <<  " " << it1->first << " " << it1->second;
}
1
0 / 0 / 0
Регистрация: 05.08.2010
Сообщений: 12
15.08.2010, 13:22  [ТС]
Благодарю! Огромное тебе человеческое Спасибо! Все прекрасно работает.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.08.2010, 13:22

Чтение информации для вектора структур, из бинарного файла
Добрый день, есть у меня класс, что-то вроде электронного реестра, данные хранятся в виде структуры, а те, в свою очередь, помещены в...

Заполнение массива структур из .txt файла (файловый ввод/вывод)
Доброго времени суток! Есть некоторая задача: в файле .txt есть список студентов(ФИО, предмет, оценка) и все это нужно отсортировать(не...

Создать массив структур, заполнив его информацией из файла “input.txt”. Упорядочить этот массив по убыванию суммы баллов
В файле “input.txt” задано количество студентов механикоматематического факультета ННГУ и их список. В каждой строке списка содержатся...

В папке К2 создайте файл t3.txt, в который перепишите вначале текст из файла t1.txt, а затем из t2.txt
Программным путем: 1. В папке С:\temp создайте папки К1 и К2. 2. В папке К1: a) создайте файл t1.txt, в который запишите следующий...

Переписать компоненты файла 1.txt в файл 3.txt так, чтобы в файле 3.txt числа шли в определенном порядке
Дан файл 1.txt, компоненты которого являются целыми числами.Файл 1.txt содержит столько же отрицательных чисел, сколько положительных....


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

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Новые блоги и статьи
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу))) Критические ошибки, мешающие компиляции и. . .
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата) Этот документ предназначен для того, чтобы новый чат Claude мог продолжить работу без необходимости заново разбираться в. . .
сукцессия 15 неявная схема
anaschu 29.06.2026
Алиса Калибровка параметров симбиотической модели: технический обзор Содержание: Введение Постановка проблемы Технические аспекты реализации Процесс внедрения изменений
сукцессия 14. Обновленная схема модели
anaschu 28.06.2026
ГЛОБАЛЬНАЯ ОПИСАТЕЛЬНАЯ СПЕЦИФИКАЦИЯ ЭКОСИСТЕМНОЙ МОДЕЛИ «SOIL CHEMISTRY & MYCORRHIZA 2. 0» https:/ / ibb. co/ NnkGpfMd Представленная интегрированная схема описывает непрерывную нелинейную. . .
сукцессия 13. Питон модель трехзонного мицелия, пока что в основном арбускулярного
anaschu 28.06.2026
## Разработка агентной модели микоризной сукцессии: от выявления артефактов к созданию комплексной системы ### Аннотация Представлено исследование по разработке агентной модели микоризной. . .
сукцессия 12. краткий список проверок модели перед запуском.
anaschu 27.06.2026
Скрытые отказы в моделях систем динамики (SD-models) экологических систем: два случая из практики Контекст Разбирался прототип модели систем динамики (SD-модели) микоризной сукцессии: пять. . .
Сукцессия 11. Проверка орудий перед войной: разработка через тестирование
anaschu 27.06.2026
Как не дать модели соврать самой себе: проверки для симуляции микоризной сукцессии Введение Когда вы строите математическую модель живой системы — грибов, растений, почвы — главная опасность. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru