Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
31 / 15 / 7
Регистрация: 08.01.2019
Сообщений: 636

Запись из файла в структуру, в цикле

31.05.2020, 12:33. Показов 1031. Ответов 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
64
65
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
 
using namespace std;
 
struct Book {
    string FIO;
    string number;
    string email;
};
 
 
void ShowData(Book* phone, int size)
{
 
    cout << "\n#\tName\tPhone\tE-mail\n";
    for (int i = 0; i < size; i++)
    {
        cout << i + 1 << "\t" << phone[i].FIO << "\t" << phone[i].number << "\t" << phone[i].email << "\n";
    }
    cout << endl;
}
 
void ReadFromFile(string filename, Book* phone)
{
    ifstream fin(filename);//создали поток
    if (!fin)
    {
        cout << "R Tape Loading Error\n";//если файл не открывается 
    }
    else//иначе
    {
          string buff;
          int count = 0;
        
            for (; !fin.eof(); count++) {
                getline(fin, buff);
                cout << buff << "\n";
                stringstream ss(buff);//если закоментить отсюда
                ss >> phone[count].FIO >> phone[count].number >> phone[count].email;
                phone[count].FIO = buff;
                phone[count].number = buff;
                phone[count].email = buff;// до сюда включно
           }
           
       
        if (count > 0) { // и забыть про это то работает, знач считал файл  я правильно читаю, а чего не могу записать в структуру не понимаю, крашится экзешник  
            cout << "\n\nAdded after read file: " << filename << endl;
            ShowData(phone, count);
        }
        }
    fin.close();
}
 
void main() {
 
    Book* phone = 0;//указатель на массив структур
   
    ReadFromFile("data2.txt", phone);
    
 
    delete[] phone;
}
уже не совсем мозг не варит, хоть бы название ошибки было..

Добавлено через 55 минут
пардон, вот так
C++
1
2
3
4
5
6
7
for (; !fin.eof(); count++) {
                getline(fin, buff);
                cout << buff << "\n";
                stringstream ss(buff);//если закоментить эти
                ss >> phone[count].FIO >> phone[count].number >> phone[count].email; //строки
               
           }
Добавлено через 59 секунд
Что я сделал не так?(
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
31.05.2020, 12:33
Ответы с готовыми решениями:

Запись из файла в структуру
Здравствуйте, как реализовать то, чтоб данные из файла (формат .txt) записывались в структуру? Буду рад любой подсказке. Заранее...

Запись данных из файла в структуру
Условие задачи ниже. Файл с данными: What are colors in Russian flag (from top to bottom)? Red, blue and white white, blue and red ...

Чтение из файла и запись в структуру
Добрый день! Мне надо выполнить вход от имени администратора, логин и пароль написан в файле, есть структура User с логином и паролем...

8
Параллельный Кот
 Аватар для valen10
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
31.05.2020, 12:41
Цитата Сообщение от Vlast001 Посмотреть сообщение
C++
59
Book* phone = 0;//указатель на массив структур
Память кто выделять будет?

И какой объем потребуется, заранее известно?
Цитата Сообщение от Vlast001 Посмотреть сообщение
C++
38
for (; !fin.eof(); count++) {
Так делают только искатели приключений. eof() при чтении файла не нужен.
1
31 / 15 / 7
Регистрация: 08.01.2019
Сообщений: 636
31.05.2020, 12:57  [ТС]
Цитата Сообщение от valen10 Посмотреть сообщение
Так делают только искатели приключений. eof() при чтении файла не нужен.
чем плох? как по вашему правильно?

Цитата Сообщение от valen10 Посмотреть сообщение
Память кто выделять будет?
блин, извините,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Book* Add(Book* phone, int const count) //функция увеличения динамического массива структур
{
    if (count == 0)//если в массиве стуктур еще нет ни одного элемента
    {
        phone = new Book[1];//выделяем память на 1 элемент
    }
    else//иначе, если в массиве структур уже есть элементы
    {
        Book* temp = new Book[count + 1];//создаем промежуточный массив с размером + 1
        for (int i = 0; i < count; i++)//копируем все элементы из старого массива в новый
        {
            temp[i] = phone[i];
        }
        delete[] phone;//удаляем старый массив
        phone = temp;//переписываем адрес старого массива на адрес нового массива
    }
    return phone; //возвращаем адрес нового массива стуктур
}
Я это использовал когда добавлял из консоли
этим методом:
C++
1
2
3
4
5
6
7
void SetData(Book phone[], int const count)
{
    cout << "Enter name\n"; getline(cin, phone[count].FIO);
    cout << "Enter number\n"; getline(cin, phone[count].number);
    cout << "Enter e-mail\n"; cin >> phone[count].email;
    
}
мейн был такой:
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
void main() {
    Book* phone = 0;//указатель на массив структур
    int count = 0;//счетчик стукрур в массиве
    bool YesOrNo = true;
 
    do
    {
        phone = Add(phone, count);//получаем адрес на массив структур
        SetData(phone, count);//передаем стуктуру в функцию для заполнения последней стукруты
        count++;
 
        cout << "Enter new data(1 - Yes, 0 - No)\n";
        cin >> YesOrNo;
        cin.get();
 
    } while (YesOrNo);
    if (YesOrNo == false)
    {
           WriteToFile("data.txt", phone, count);
           ShowData(phone, count);
           Find(phone, count);
          
    }
 
    delete[] phone;
}
Убедившийся, что все работает я перешел на запись в структуру из файла, но все не как не выходило, и я все начал коментить, чтобы работать, только с не работающей функцией и ничего не вышло

Добавлено через 5 минут
Цитата Сообщение от valen10 Посмотреть сообщение
И какой объем потребуется, заранее известно?
За ранние не известно, зависит от того сколько захочет ввести пользователь или от файла( в будущем хочу предоставить выбор откуда брать данные - консоль или файл и предоставить возможность потом дополнить базу данных считав еще раз файл или дать пользователю дописывать вручную)
0
0 / 1 / 0
Регистрация: 19.05.2020
Сообщений: 25
31.05.2020, 12:58
Для начала
Book* phone = 0;//указатель на массив структур
А выделять память заранее не надо думаешь?

В процедуре phone=NULL
при обращении к phone[count] не падает разве?
phone[count].FIO = buff; это к чему приравнивается?


Может тебе проще работать Си методами.
Сделать структуру сделать фиксированного размера типа
struct Book {
string FIO[100];
int number;
char email[100];
};
и писать и считывать её в бинарном виде типа
int ReadStruct(char *file, void *Struct, int size) {
int rc=0;
FILE *fs;
if ((fs = fopen(file, lock?"r+b":"rb")) == NULL)
return e_rd;

if (fread(Struct, size, 1, fs) < 1) {
rc=e_rs;
}
fclose(fs);

return rc;
}

Перед считыванием смотришь размер файла и выделяешь память.
0
31 / 15 / 7
Регистрация: 08.01.2019
Сообщений: 636
31.05.2020, 13:04  [ТС]
Цитата Сообщение от DFService Посмотреть сообщение
Может тебе проще работать Си методами.
Сделать структуру сделать фиксированного размера типа
Нет, эт не подходит)
0
Параллельный Кот
 Аватар для valen10
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
31.05.2020, 13:41
Цитата Сообщение от Vlast001 Посмотреть сообщение
чем плох?
Плох тем, что используется здесь не по назначению.
C++
1
2
3
4
Book tmp;
while (fin >> tmp.FIO >> tmp.number >> tmp.email) {
    // Вставка прочитанного элемента в массив.
}
0
31 / 15 / 7
Регистрация: 08.01.2019
Сообщений: 636
31.05.2020, 13:48  [ТС]
valen10,
Цитата Сообщение от valen10 Посмотреть сообщение
Память кто выделять будет?
Вы прям меня из транса вывели, огромное спасибо!
Работает:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
string buff;
        string name;
        string numb;
        string email;
        int count = 0;
for (; !fin.eof(); count++) {
            getline(fin, buff);
            cout << buff << "\n";
            stringstream ss(buff);
            ss >> name >> numb >> email;
            phone = Add(phone, count);
            phone[count].FIO = name;
            phone[count].number = numb;
            phone[count].email = email;
          
        }
И вы меня все-таки задели, хочу узнать почему eof() плохо и что лучше тогда юзать


P.S. я в мейне освобождаю память полностью delete[] phone... Можете навести, пожалуйста, пример удаление конкретных элементов из моей структуры, вот фрагмент из функции поиска:
C++
1
2
3
4
5
6
7
8
for (int i = 0; i < size; i++)
        {
            if (phone[i].FIO == answer)
            {
                cout << "\t" << phone[i].FIO << "\t" << phone[i].number << "\t" << phone[i].email << "\n";
            }
 
        }
Если я хочу удалять, что-то конкретно я примерно так и буду делать но вопрос как будет происходить самое удаление
так?
C++
1
2
3
if(phone[i].FIO == answer){
     delete[] phone[i].FIO; // или так delete phone[i].FIO; или как вообще именно удалят в таких случаях?
}
Добавлено через 5 минут
Цитата Сообщение от valen10 Посмотреть сообщение
Book tmp;
while (fin >> tmp.FIO >> tmp.number >> tmp.email) {
    // Вставка прочитанного элемента в массив.
}
Но я передаю в функцию указатель на массив структур Book*
и как тут программа понимает, что между строками пробелы которые читать не нужно?
0
Параллельный Кот
 Аватар для valen10
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
31.05.2020, 14:13
Цитата Сообщение от Vlast001 Посмотреть сообщение
и как тут программа понимает, что между строками пробелы которые читать не нужно?
Точно так же, как и со stringstream.
Цитата Сообщение от Vlast001 Посмотреть сообщение
хочу узнать почему eof() плохо и что лучше тогда юзать
Потому что он предназначен для диагностики ошибок, а не чтобы искать конец файла. Попробуйте провести самостоятельно небольшое исследование на такой программе:
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
#include <iostream>
#include <fstream>
 
int main() {
    {
        std::ifstream fin("input.txt");
        while (!fin.eof()) { // <<< Не повторяйте этот код в своих программах!!!
            int x;
            fin >> x;
            std::cout << x << ' ';
        }
        std::cout << '\n';
    }
 
    {
        std::ifstream fin("input.txt");
        int x;
        while (fin >> x) {
            std::cout << x << ' ';
        }
        std::cout << '\n';
    }
 
    return 0;
}
Во входной файл запишите несколько целых чисел и посмотрите на результат работы. Попробуйте разные варианты:
- записывать числа в строку;
- записывать числа столбиком;
- смешать первые два варианта;
- добавлять или не добавлять пустые строки после последней строки с числами.

Добавлено через 10 минут
Цитата Сообщение от Vlast001 Посмотреть сообщение
пример удаление конкретных элементов из моей структуры
Что значит "удаление элементов структуры"? Удалить из объекта типа Book поле FIO? Так не получится сделать в текущей реализации: поля структуры невозможно удалить во время выполнения программы.

Можно удалить элемент массива полностью. Варианты:
1. Поместить на его место последний элемент. Уменьшить значение count на 1. Чтобы знать вместимость массива, потребуется еще одна переменная capacity.
2. Сместить хвост массива на 1 влево, остальное аналогично п.1 (это дольше, но сохранит порядок).
3. Выделить память под массив на 1 элемент меньше, скопировать туда все элементы, кроме удаляемого. Уменьшить count на 1, освободить память старого массива.

ИМХО, массивы для таких задач подходят плохо. Линейные списки еще не пробовали освоить?
0
0 / 1 / 0
Регистрация: 19.05.2020
Сообщений: 25
01.06.2020, 00:46
Цитата Сообщение от Vlast001 Посмотреть сообщение
Book* Add(Book* phone, int const count) //функция увеличения динамического массива структур
{
if (count == 0)//если в массиве стуктур еще нет ни одного элемента
{
phone = new Book[1];//выделяем память на 1 элемент
}
else//иначе, если в массиве структур уже есть элементы
{
Book* temp = new Book[count + 1];//создаем промежуточный массив с размером + 1
for (int i = 0; i < count; i++)//копируем все элементы из старого массива в новый
{
temp[i] = phone[i];
}
delete[] phone;//удаляем старый массив
phone = temp;//переписываем адрес старого массива на адрес нового массива
}
return phone; //возвращаем адрес нового массива стуктур
}
Зачем так сложно, есть же вектора?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.06.2020, 00:46
Помогаю со студенческими работами здесь

Запись из бинарного файла в структуру
Реализовал запись из бинарника в структуру на С++, решил добавить удобства и оформить в формах C#. И тут появилась трудность переноса кода...

Запись данных в структуру из файла
Пытаюсь прочесть файл и записать содержимое в структуру. #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #define NUMBER_OF_GAMES 10 ...

Считывание строк из файла и запись в структуру
Есть некая структура и массив таких структур x. struct cyberforum { int a; char b; float c; char d; } *x; Пытаюсь...

Запись в структуру из файла. База данных
Добрый день. Помогите советом, очень нужно, т.к. собираюсь доделать за ближайшие часы. Я пишу базу данных на основе двусвязного...

Запись в структуру из файла, используя foreach
Добрый день, никак не могу понять, как записать полученный данные из *.ini файла в свою структуру. Части кода: struct Config ...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью в КА2. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru