Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 06.09.2019
Сообщений: 6
1

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

06.09.2019, 16:50. Показов 642. Ответов 8
Метки нет (Все метки)

Необходимо считать данную структуру из текстового файла:

Задача 1.
Пусть дан файл в следующем виде:
[2019 ( осенний семестр : Иванов - 5, 4, 3; Сидоров – 4, 4, 4; Мазуров – 3, 3, 4)
(весенний семестр: Иванов - 5, 5, 5; Сидоров – 3, 3, 4; Мазуров – 3, 3, 2)]
[2018 ( осенний семестр : Иванов - 3, 3, 3; Сидоров – 5, 4, 5; Мазуров – 2, 3, 4)
(весенний семестр: Иванов - 4, 5, 5; Сидоров – 4, 3, 4; Мазуров – 3, 3, 3)]
[2017 ( осенний семестр : Иванов - 3, 3, 3; Петров – 4, 4, 4; Назаренко– 4, 4, 4)
(весенний семестр: Иванов - 3, 5, 5; Петров – 4, 3, 3; Назаренко – 5, 3, 5)]

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

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
#include<iostream>
#include<math.h>
#include<conio.h>
#include<windows.h>
#include<string>
#include<fstream>
#include<cstring>
 
using namespace std;
 
struct Student
{
    string Name;        //Имя студента
    int Mark[3];        //Оценки студента (у каждого студента по три)
};
 
struct Semestr
{
    string NazSem;      //Название семестра (осенний/весенний)
    Student Stud[3];    //Студенты данного семестра (в каждом семестре по три студента)
};
 
struct Period
{
    int God;            //Рассматриваемый год
    Semestr Sem[2];     //Семестры (в каждому году по два) 
};
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    
    Period Per[3]; //В файле содержится инфа о трех годах обучения
    ifstream Doc("file.txt");
    string Stroka = "";
    
    while(getline(Doc, Stroka)) 
    {
        cout << Stroka << endl;
    }
    Doc.close();
    
    getch();
}
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.09.2019, 16:50
Ответы с готовыми решениями:

Считывание из файла в массив структур
Доброго времени суток! Есть структура: struct iDiscipline{ char name; int num_course;...

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

Считывание и вывод массива структур
Есть файл где описан массив структур, при выводе выводит правильно только первые три переменные...

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

8
бах-бах и в продакшен!
3034 / 1637 / 573
Регистрация: 23.09.2014
Сообщений: 5,093
Записей в блоге: 4
07.09.2019, 04:39 2
Tora190,
вариант считать файл целиком в буфер
распарсить, проставить терминаторы
и затем раздать указатели на соответствующие строки:

C++
1
2
3
4
    char bufer[] = "000,foo,111";
    char* zz = myparse();
    std::string s;
    s = (const char*) zz;
другой вариант более медленный, но легкий в кодировании:
для примера:
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
...
 
struct Passagir
{
    char fio[35];
    char Npasport[12];
    int kup;
    int Nb;
    string mesto;
    int st;
}chel[50];
 
///----------------------------------------------------------------------------|
#include <fstream>
/// Пишем в файл:-------------------------------------------------------------->
void to_file()
{   std::cout << "Пишем в файл!" << "\n";
    std::ofstream file("my.txt");
    for(size_t i = 0; i < 50; i++)
    {   file << chel[i].fio      << " "
             << chel[i].kup      << " "
             << chel[i].mesto    << " "
             << chel[i].Nb       << " "
             << chel[i].Npasport << " "
             << chel[i].st       << "\n";
    }
    file.close();
}
 
/// Читаем из файла:----------------------------------------------------------->
bool from_file()
{   std::cout << "Читаем из файла..." << "\n";
    std::ifstream file("my.txt");
    if (!file.is_open())
    {   std::cout << "Ошибка чтения файла!\n";
        return false;
    }
    for(size_t i = 0; i < 50; i++)
    {   file >> chel[i].fio 
             >> chel[i].kup 
             >> chel[i].mesto 
             >> chel[i].Nb 
             >> chel[i].Npasport 
             >> chel[i].st;
    }
    file.close();
    return true;
}
...
сначала пишем в файл, потом что записали можно прочесть обратно.
0
Эксперт C
26063 / 16253 / 3494
Регистрация: 24.12.2010
Сообщений: 35,614
07.09.2019, 10:10 3
XLAT, держу пари, что второй способ у вас не прокатит. При выводе все сольется в одну строку, и ввода не получится вовсе.
Имхо, тут вопрос скорее всего в том, что писать-читать нада целиком структуры в бинарном виде. Типа
C++
1
2
fwrite(chel+i, sizeof(struct Passadir), 1, file);
fread(chel+i, sizeof(struct Passadir), 1, file);
0
1360 / 997 / 316
Регистрация: 28.07.2012
Сообщений: 2,759
07.09.2019, 10:21 4
Цитата Сообщение от Байт Посмотреть сообщение
что писать-читать нада целиком структуры в бинарном виде
Для этого объект должен быть тривиально копируемым. Тут нужна нормальная сериализация в, скажем, json, xml или какой-нибудь бинарный формат.
0
Эксперт C
26063 / 16253 / 3494
Регистрация: 24.12.2010
Сообщений: 35,614
07.09.2019, 10:30 5
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Тут нужна нормальная сериализация в, скажем, json, xml или какой-нибудь бинарный формат.
В простейшем случае достаточно просто бинарного формата, задаваемого структурой.
0
бах-бах и в продакшен!
3034 / 1637 / 573
Регистрация: 23.09.2014
Сообщений: 5,093
Записей в блоге: 4
07.09.2019, 22:29 6
Цитата Сообщение от Байт Посмотреть сообщение
В простейшем случае достаточно просто бинарного формата, задаваемого структурой.
формально вы правы, но у топикастера структуры не POD типа!

Цитата Сообщение от Байт Посмотреть сообщение
второй способ у вас не прокатит
ещё как прокатит(раз уже прокатывало).
А с чего вы так решили?
Для случая афтора:
простое правило: каждая структура, требующая записи/чтения на диск должна УМЕТЬ записывать и читать себя на диск.
приблизительно так:
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
struct Student
{   string Name;
    int    Mark[3];
    
    bool to_file  (std::ofstream file)
    {   file << Name;
        for(...
        {   file << Mark[i];
        }
    }
    bool from_file(std::ifstream file);
    {   file >> Name;
        for(...
        {   file >> Mark[i];
        }
    }
};
 
struct Semestr
{   string  NazSem;
    Student Stud[3];
    
    bool to_file  (std::ofstream file)
    {   for(...
        {   Stud.to_file(file);
        }
        file << NazSem;
    }
    bool from_file(std::ifstream file)
    {   for(...
        {   Stud.from_file(file);
        }
        file >> NazSem;
    }
};
 
struct Period
{   int     God;
    Semestr Sem[2];
    
    bool to_file  (std::ofstream file)
    {   for(...
        {   Sem.to_file(file);
        }
        file << God;
    }
    bool from_file(std::ifstream file)
    {   for(...
        {   Sem.from_file(file);
        }
        file >> God;
    }
};


если такое кому-то покажется громоздко, тогда ему придется либо забить на файлы(==на всё погромирование) либо юзать ещё более громоздкие сторонние библы.

в чём прелесть небинарного подхода это возможность редактирования таких сейвов ручками или лапками в привычном для юзера редакторе.
0
2 / 1 / 0
Регистрация: 14.06.2013
Сообщений: 46
07.09.2019, 22:31 7
Я не то написал( не про парсинг а про базу(
0
бах-бах и в продакшен!
3034 / 1637 / 573
Регистрация: 23.09.2014
Сообщений: 5,093
Записей в блоге: 4
07.09.2019, 22:40 8
dwa83, Байт это ваш твинк?
0
2 / 1 / 0
Регистрация: 14.06.2013
Сообщений: 46
07.09.2019, 23:00 9
Нет, я просто датый, сначала написал ответ фигню, а потом поменял))

Добавлено через 5 минут
Цитата Сообщение от XLAT Посмотреть сообщение
Байт
это кто?)

Добавлено через 1 минуту
если кто-то жутко крутой, то да, я его твинк ыыыы)офтопим
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.09.2019, 23:00

Заменить считывание с клавиатуры на считывание из файла
Помогите пожалуйста, ни разу не работал со считыванием из файла поэтому не понимаю как и что...

Сохранение и считывание массива структур в\из файла
Код программы нижу привел на всякий случай весь #include &lt;windows.h&gt; #include &lt;string&gt; #include...

Считывание(запись) Excel в(из) массив структур
Добрый день. Подскажите пожалуйста как проще выполнить считывание данных с Excel и записать в...

Запись и считывание массива структур (документ XML)
Есть задание: Ресторан содержит список блюд. Создайте массив структур «Блюда», структура содержит...


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

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

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