Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
1 / 1 / 0
Регистрация: 19.03.2022
Сообщений: 99

Разработать программу управление двоичными файлами с записями фиксированной длины(структура и работа с ней)

10.11.2022, 03:17. Показов 4163. Ответов 62

Студворк — интернет-сервис помощи студентам
Приветствую всех. Очередное задание, над которым я буду биться не покладая рук несколько дней.
Как обычно от всех читающих рад буду получить любое пояснение / видение / список литературы и полезные ссылки / код / алгоритм к моему заданию, а так же пожелания удачи и терпения

Для начала прикладываю требования из методички, которым постараюсь следовать.

Общие требования:
файл состоит из записей определенной структуры, согласно варианту. Записи имеют ключ, уникальный в пределах файла.
Требования к подготовке и выполнению задания
1. Разработать структуру записи двоичного файла согласно варианту задания.
2. Подготовить тестовые данные в текстовом файле с кодировкой ASCII, в соответствии со структурой записи варианта. При открытии файла выполнить контроль его существования и открытия.
Примечание. Реализация операций по чтению данных из файла будет проще, если значение для каждого поля записи размещать на отдельной строке текстового редактора.
3. Имя файла вводит пользователь.
4. При открытии файла обеспечить контроль существования и открытия файла.
5. При применении механизма прямого доступа к записи файла выполнить контроль присутствия записи с заданным номером в файле.
6. Разработать функции для выполнения операций:
  • преобразование тестовых данных из текстового файла в двоичный файл;
  • сохранение данных двоичного файла в текстовом, так, чтобы используя их можно было восстановить двоичный файл;
  • вывод всех записей двоичного файла;
  • доступ к записи по ее порядковому номеру в файле, используя механизм прямого доступа к записи в двоичном файле;
  • удаление записи с заданным значением ключа, выполнить путем замены на последнюю запись.
  • Манипулирование записями в двоичном файле согласно дополнительным операциям, определенным в варианте;
7. Сохраните функции в новом модуле.
8. Разработать приложение, демонстрирующее выполнение всех операций, подключив к нему модуль с функциями.
9. Выполнить тестирование приложения, продемонстрировав выполнение всех операций.

То, что указано в задании 6 важно. Я обязательно напишу каждую функцию, но пока постараюсь сосредоточиться на основном задании и начну с него.
Дабы не усложнять жизнь и кидать сюда код, я всё буду делать в одном файле, потом разнесу и через switch case сделаю минюшку, чтобы удобно всё это тестить.


Само же задание(основная функция) звучит так:


Структура записи:
Учет техосмотра автомобилей.
Структура записи об автомобиле:
Номер (код региона, цифровой код, буквенный код), Модель, Цвет, Сведения о владельце (Фамилия, Имя, Адрес), дата последнего техосмотра.

Доп. Операция:
1. Заменить дату техосмотра у автомобиля с заданным номером на новую дату.
2. Сформировать список авто одной модели, прошедших техосмотр в заданную дату.



P.S Пока не могу задать какого-то конкретного вопроса, а просить чтобы растолковали что там вообще в условии написано как-то неловко (хотя я был бы рад). В общем буду писать конкретные вопросы как только смогу их составить. Пока же рад любой информации по теме. Главное — не сдать, а разобраться. Сейчас же постараюсь дойти хотя бы до какой-то части этого процесса. Начну, видимо со структуры и работы с ней. Надеюсь на твоё понимание, дорогой читатель)))
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.11.2022, 03:17
Ответы с готовыми решениями:

Управление двоичными файлами с записями фиксированной длины.Разбиаение записи на команды
Имеется задача. Честно говоря, не знаю как подступиться ни с точки зрения кода ни алгоритмически. Очень плохо даётся всё связанное с...

Работа с двоичными файлами: слова заданной длины
Работа с двоичными файлами: Создать файл, состоящий из слов. Вывести на экран все слова, длина которых равна заданному числу.

Создать текстовый файл с записями фиксированной длины.
Создать текстовый файл с записями фиксированной длины. Файл содержит информацию о стоимости 10 наименований товаров в различных...

62
1 / 1 / 0
Регистрация: 19.03.2022
Сообщений: 99
13.11.2022, 15:04  [ТС]
А вот и первый вопрос. Какими типами данных сделать поля в структуре? Конкретно сведения о владельце (Фамилия, Имя, Адрес) и Номер (код региона, цифровой код, буквенный код). Я бы скорее всего предпочел просто все сделать стринговым и писать строку, но как тогда потом с этим всем работать?
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
13.11.2022, 15:18
Цитата Сообщение от daniil_novel Посмотреть сообщение
Разработать программу управление двоичными файлами с записями фиксированной длины
Цитата Сообщение от daniil_novel Посмотреть сообщение
Я бы скорее всего предпочел просто все сделать стринговым
Судя по заданию так не получится.
По крайней мере задание предусматривает совсем другое решение.

Добавлено через 2 минуты
Думаю все поля структуры должны быть фиксированной длинны и "простыми" типами.
Строки - массивы символов максимальной необходимой длинны + нуль-терминатор.
0
1 / 1 / 0
Регистрация: 19.03.2022
Сообщений: 99
13.11.2022, 15:30  [ТС]
А что значат эти "простые" типы? Я помню, что там был прикол какой-то с типом char* который возвращал вроде как строку

Добавлено через 4 минуты
Цитата Сообщение от SmallEvil Посмотреть сообщение
Думаю все поля структуры должны быть фиксированной длинны и "простыми" типами.
Вообще у нас есть поле номер. Оно само по себе сложное (код региона, цифровой код, буквенный код). То есть по хорошему, как я понимаю, надо в структуру записать еще одну структуру, чтобы создать тип данных nomer с тремя параметрами. Просто по-другому не знаю как это сделать. Мы же не можем в массив забить и буквы и цифры?
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
13.11.2022, 15:40
Цитата Сообщение от daniil_novel Посмотреть сообщение
А что значат эти "простые" типы?
По простому, своими словами.
Размер типа равен, размеру всех данных его полей, именно данных.
Это должно быть справедливо и для всех полей, и их полей и ...
(выравнивание пока не будем обсуждать)

Пример :
int - простой тип
int * - тоже простой, но обычно, значение указателя не используются как постоянные данные и не несет в себе полезные для сохранения данные.
По ним обычно хранятся другие данные, размер которых мы не всегда можем знать заранее.
И сам указатель не хранит эти данные.
То есть, указатель не хранит в себе полезные для нас данные, а лишь ссылается на них.
Так что мы его логически относим к "сложным типам".

Такими типами могут выступать и типы на первый взгляд простые.
Например тип с числовыми временными идентификаторами записей базы данных.
Как то так ...

Цитата Сообщение от daniil_novel Посмотреть сообщение
Мы же не можем в массив забить и буквы и цифры?
Можем. И создать средства доступа к определенному логическому фрагменту этой записи.

Добавлено через 1 минуту
Цитата Сообщение от daniil_novel Посмотреть сообщение
как я понимаю, надо в структуру записать еще одну структуру
Если оправдано, то можно.
0
1 / 1 / 0
Регистрация: 19.03.2022
Сообщений: 99
13.11.2022, 15:55  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
Можем. И создать средства доступа к определенному логическому фрагменту этой записи.
Понял. Тогда от этого и буду отталкиваться

Я попробовал. Если правильно понял, то как-то так

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <fstream>
#include <string>
 
#define SIZE_ARR 256
 
using namespace std;
 
struct autoCard {
    char *carNum = new char[SIZE_ARR];
    char *modelm = new char[SIZE_ARR];
    char *color = new char[SIZE_ARR]; 
    char *infoForHolder = new char[SIZE_ARR];
    int data;
 
};
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
13.11.2022, 16:05
Цитата Сообщение от daniil_novel Посмотреть сообщение
char *carNum
Ну нет же
вместо
C++
1
char *carNum = new char[SIZE_ARR];
будет массив, он все данные хранит в себе, и мы знаем его размер.
C++
1
char carNum[SIZE_ARR];
Добавлено через 1 минуту
И еще, я бы вынес константы рамзеров для каждого поля отдельными, так как длины для них ожидаются различными, и для всех выделять по 256 байтов, слишком расточительно.

Добавлено через 6 минут
Может станет понятней если я приведу пример чтения / записи такой структуры в файл ?
C++
1
2
3
4
5
6
7
8
9
10
struct Car{
   char model[32];
   char number[12];
};
 
Car c1{"BMW", "DP3125-UA"};
file_out.write((char*)(&c1), sizeof(Car) );
 
Car c2;
file_in.read((char*)(&c2), sizeof(Car) );
0
1 / 1 / 0
Регистрация: 19.03.2022
Сообщений: 99
13.11.2022, 16:06  [ТС]
Аа, так вот оно как. Сейчас переделаю
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
13.11.2022, 16:15
Где то я такое задание уже видел ...
0
1 / 1 / 0
Регистрация: 19.03.2022
Сообщений: 99
13.11.2022, 16:27  [ТС]
Видели такое же? Тогда было бы классно ссылочку заиметь. Вообще я такое первый раз задаю

Добавлено через 43 секунды
Цитата Сообщение от SmallEvil Посмотреть сообщение
(char*)(&c1)
Что вот эта запись значит?
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
13.11.2022, 16:30
Цитата Сообщение от daniil_novel Посмотреть сообщение
Видели такое же?
По сути такое же, при том ваше.
Управление двоичными файлами с записями фиксированной длины.Разбиаение записи на команды
0
1 / 1 / 0
Регистрация: 19.03.2022
Сообщений: 99
13.11.2022, 16:31  [ТС]
А. Не совсем. Там была реализация хеширования по больше части
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
13.11.2022, 16:34
Цитата Сообщение от daniil_novel Посмотреть сообщение
Что вот эта запись значит?
Получаем указатель на объект типа Car - &c1.
Приводим его к указателю на char - (char*).
read и write, пишут читают символы (байты), не форматированный ввод/вывод.

Добавлено через 1 минуту
Вторым параметром указываем сколько байт нужно почитать/записать. Полный размер структуры Car (весь объект структуру)
0
1 / 1 / 0
Регистрация: 19.03.2022
Сообщений: 99
13.11.2022, 17:40  [ТС]
Такс. Стало понятнее. Попробую на базе этого сделать функцию с заменой даты

Добавлено через 22 минуты
Сделал, но прога сильно ругается на
C++
1
carBuf.data = newData;
. Видимо нельзя одному полю структуры присвоить значение другого поля. И теперь я стал сомневаться в формулировке условия. Нам нужен какой-то файл со списком машин и информации о них или массив наших структур в котором мы будем искать ту самую с нужным нам номером?


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
struct Car {
    char carNum [12];
    char model[32];
    char color[12]; 
    char infoForHolder[256];
    char data[12];
 
};
 
void replaceData(Car car, char num[12], char newData[12]) {
    Car carBuf = car;
    if(carBuf.carNum == num) {
        carBuf.data = newData;
    }
}
 
int main() {
    setlocale(LC_ALL, "rus");
    Car c1{"97-123-ABC", "BMW", "red", "Petrov-Petr-Msk-Stroiteley-20k1", "03.08.2022"};
    replaceData(c1, "97-123-ABC", "03.08.2022");
 
}
Добавлено через 3 минуты
Еще достаточно странное в задании представление номера. Я погуглил. Обычно они выглядят вот так "A000AA" и дальше 97/rus. Я же постарался сделать как сказано в условии, то есть код региона, потом цифровой и потом фуквенный. Ничего лучше, чем разделить их "-" я не придумал

Добавлено через 23 минуты
Цитата Сообщение от daniil_novel Посмотреть сообщение
void replaceData(Car car, char num[12], char newData[12]) {
    Car carBuf = car;
    if(carBuf.carNum == num) {
        carBuf.data = newData;
    }
}
Исправил функцию
C++
1
2
3
4
5
6
void replaceData(Car car, char num[12], char newData[12]) {
    Car carBuf = car;
    if(carBuf.carNum == num) {
        strcpy(newData, carBuf.data);
    }
}
Добавлено через 15 минут
Ещё немного боли и рефактроринга.

Получилось на этот раз так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void replaceData(Car car, char num[12], char newData[12]) {
    Car carBuf = car;
    if(carBuf.carNum == num) {
        strcpy(newData, carBuf.data);
    }
}
 
int main() {
    setlocale(LC_ALL, "rus");
    Car c1{"97-123-ABC", "BMW", "red", "Petrov-Petr-Msk-Stroiteley-20k1", "03.08.2022"};
    char num[] = "97-123-ABC";
    char newData[] = "01.01.2022";
    replaceData(c1, num, newData);
 
}
Теперь прога хотя бы компилится, что не может не радовать
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
13.11.2022, 17:46
char * strcpy ( char * destination, const char * source );
первый параметр - назначение, второй источник
0
1 / 1 / 0
Регистрация: 19.03.2022
Сообщений: 99
13.11.2022, 17:53  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
первый параметр - назначение, второй источник
Исправил, оно даже работает. Но проблема в if. Прога пишет что "Всё плохо" и мне вот интересно. Как может сравнение не работать, если что-то, что другое в примере 97?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int replaceData(Car car, char num[12], char newData[12]) {
    Car carBuf = car;
    if(car.carNum == num) {
        strcpy(carBuf.data, newData);
        cout << carBuf.data << "Вот такие пироги" << endl;
    } else {
        cout << "Все плохо" << endl;
    }
    return 0;
}
 
int main() {
    setlocale(LC_ALL, "rus");
    Car c1{"97", "BMW", "red", "Petrov-Petr-Msk-Stroiteley-20k1", "03.08.2022"};
    char num[] = "97";
    char newData[] = "01.01.2022";
    replaceData(c1, num, newData);
}
0
1 / 1 / 0
Регистрация: 19.03.2022
Сообщений: 99
13.11.2022, 17:53  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
первый параметр - назначение, второй источник
Исправил, оно даже работает. Но проблема в if. Прога пишет что "Всё плохо" и мне вот интересно. Как может сравнение не работать, если что-то, что другое в примере 97?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int replaceData(Car car, char num[12], char newData[12]) {
    Car carBuf = car;
    if(car.carNum == num) {
        strcpy(carBuf.data, newData);
        cout << carBuf.data << "Вот такие пироги" << endl;
    } else {
        cout << "Все плохо" << endl;
    }
    return 0;
}
 
int main() {
    setlocale(LC_ALL, "rus");
    Car c1{"97", "BMW", "red", "Petrov-Petr-Msk-Stroiteley-20k1", "03.08.2022"};
    char num[] = "97";
    char newData[] = "01.01.2022";
    replaceData(c1, num, newData);
}
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
13.11.2022, 18:19
daniil_novel,
Чему вас учили до этого момента ?
Вы не проходили указатели, работы со строками, массивы ?

Добавлено через 34 секунды
сравнить две Си строки - strcmp

Добавлено через 1 минуту
Цитата Сообщение от daniil_novel Посмотреть сообщение
if(car.carNum == num)
Это сравнивает два указателя.
Точнее их значения, адреса.
0
1 / 1 / 0
Регистрация: 19.03.2022
Сообщений: 99
13.11.2022, 18:29  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
Чему вас учили до этого момента ?
Вы не проходили указатели, работы со строками, массивы ?
Честно говоря, нас ничему не учили. Просто давали задание на тему и, как правило, ответ был у всей группы одинаковый. Сейчас решил взять всё в свои руки и научиться

Добавлено через 1 минуту
Большинство функций, которые вы мне говорите в решении, я вижу впервые. Каждую отдельно гуглю и сразу стараюсь применять
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
13.11.2022, 18:31
Цитата Сообщение от daniil_novel Посмотреть сообщение
Просто давали задание на тему и, как правило, ответ был у всей группы одинаковый
В смысле решение были одинаковыми ? )
Или :
"Задания №1"
"WTF ?"
"Задания №2"
"WTF ?"
"Задания №11"
"Hell yeah!"
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.11.2022, 18:31
Помогаю со студенческими работами здесь

Разработать программу на основе классов для определения одномерных массивов строк фиксированной длины
Разработать программу на основе классов для определения одномерных массивов строк фиксированной длины. Предусмотреть возможность обращения...

Разработать программу на основе классов для определения одномерных массивов строк фиксированной длины
Разработать программу на основе классов для определения одномерных массивов строк фиксированной длины. Предусмотреть возможность...

Работа с двоичными файлами
Дан файл координат вершин ломаной линии на плоскости. Определить, имеет ли ломаная линия самопересечения, если да, то записать в файл G...

Работа с двоичными файлами
Дана последовательность из n вещественных чисел. Записать все эти числа в файл. Вывести на экран все положительные компоненты файла.

Работа с двоичными файлами
Задачи на использование двоичных и текстовых файлов . Условие вида &quot;дан файл&quot; означает, что пользователем вводится количество элементов и...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru