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

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

10.11.2022, 03:17. Показов 4412. Ответов 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
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
16.11.2022, 01:22
Я столько копипаста за последние несколько месяцев вместе взятые не делал
И это признак что что-то не так.
Просто для примерчика.
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
// #define _CRT_SECURE_NO_WARNINGS
#include <iostream>
// #include <fstream>
#include <string>
#include <cstring>
#include <algorithm> 
#include <vector>
using namespace std;
const int SZcerNum = 12;
const int SZmodel = 32;
const int SZcolor = 12;
const int SZinfoForHolder = 256;
const int SZdate = 12;
 
struct Car {
    char carNum[SZcerNum];
    char model[SZmodel];
    char color[SZcolor]; 
    char infoForHolder[SZinfoForHolder];
    char date[SZdate];
    Car():carNum{""},model{""},color{""},infoForHolder{""},date{""}{};
    Car(const char* carNump, const char* modelp, const char* colorp, const char* infoForHolderp, const char* datep){
        strncpy(carNum, carNump, SZcerNum-1); carNum[SZcerNum-1]='\0';
        strncpy(model, modelp, SZmodel-1); model[SZmodel-1]='\0';
        strncpy(color, colorp, SZcolor-1); color[SZcolor-1]='\0';
        strncpy(infoForHolder, infoForHolderp, SZinfoForHolder-1); infoForHolder[SZinfoForHolder-1]='\0';
        strncpy(date, datep, SZdate-1); date[SZdate-1]='\0';
    }
};
 
int replaceDate(Car &car, const char *num, const char *newDate) {
    if(strcmp(car.carNum, num) == 0) {
        strcpy(car.date, newDate);
        cout << car.date << "Вот такие пироги" << endl;
    } else {
        cout << "Все плохо" << endl;
    }
    return 0;
}
 
vector<Car> generateListCar(vector<Car> &carList , const char *compareDate, const char *model) {
    vector<Car> res;
    for (const auto &car : carList)
    if ((strcmp(car.date, compareDate) == 0) && (strcmp(car.model, model) == 0))
        res.push_back(car);
    return res;
}
 
int main() {
    setlocale(LC_ALL, "Russian");
    vector<Car> dbase{
                             {"11-123-ABC", "BMW", "red", "Petrov-Petr-Msk-Stroiteley-21k1", "01.08.2022"},
                             {"23-120-CAW", "Lada", "black", "Petrov-Maksim-Msk-Stroiteley-22k1", "02.08.2022"},
                             {"66-154-WER", "Crysler", "yellow", "Petrov-Pavel-Msk-Stroiteley-23k1", "03.08.2022"},
                             {"41-178-MWD", "UAZ", "magenta", "Sidorov-Ivan-Msk-Stroiteley-24k2", "04.08.2022"},
                             {"78-223-MIG", "Crysler", "white", "Sidorov-Makar-Msk-Stroiteley-28k3", "03.08.2022"},
                             {"97-666-APO", "Crysler", "green", "Egorov-Nikita-Msk-Stroiteley-29k4", "03.08.2022"}
    };
    Car c1{"97", "BMW", "red", "Petrov-Petr-Msk-Stroiteley-20k1", "03.08.2022"};
    char num[] = "97";
    char newDate[] = "01.01.2022";
    //replaceDate(c1, num, newDate);
   
    char compareDate[] = "03.08.2022";
    char model[] = "Crysler";
 
    auto res = generateListCar(dbase, compareDate, model);
    if (!res.empty())
        for(const auto &rec : res){
            cout << rec.carNum  << ' ' << rec.model << ' ' << rec.color << ' ' << rec.infoForHolder << ' ' << rec.date << endl;
        }
    else
        cout << "Nothing found." << endl;
}
Добавлено через 1 минуту
Нужно еще подправить, эта strncpy, очень вредная функция. !!!

Добавлено через 9 минут
edit : fix some bugs

Добавлено через 1 минуту
strncpy(infoForHolder, infoForHolderp
Там опечятка была.
Вообще получилась дикая дичь. У меня волосы дыбом...

Добавлено через 10 минут
Сделал функцию замены даты.
Вообще для копирование данных в поля, стоит сделать метод(ы) какие то, или статический метод.
Кликните здесь для просмотра всего текста

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
// #define _CRT_SECURE_NO_WARNINGS
#include <iostream>
// #include <fstream>
#include <string>
#include <cstring>
#include <algorithm> 
#include <vector>
using namespace std;
const int SZcerNum = 12;
const int SZmodel = 32;
const int SZcolor = 12;
const int SZinfoForHolder = 256;
const int SZdate = 12;
 
struct Car {
    char carNum[SZcerNum];
    char model[SZmodel];
    char color[SZcolor]; 
    char infoForHolder[SZinfoForHolder];
    char date[SZdate];
    Car():carNum{""},model{""},color{""},infoForHolder{""},date{""}{};
    Car(const char* carNump, const char* modelp, const char* colorp, const char* infoForHolderp, const char* datep){
        strncpy(carNum, carNump, SZcerNum-1); carNum[SZcerNum-1]='\0';
        strncpy(model, modelp, SZmodel-1); model[SZmodel-1]='\0';
        strncpy(color, colorp, SZcolor-1); color[SZcolor-1]='\0';
        strncpy(infoForHolder, infoForHolderp, SZinfoForHolder-1); infoForHolder[SZinfoForHolder-1]='\0';
        strncpy(date, datep, SZdate-1); date[SZdate-1]='\0';
    }
};
 
bool replaceDate(vector<Car> &carList, const char *num, const char *newDate) {
    for ( auto &car : carList){
        if(strcmp(car.carNum, num) == 0) {
            strncpy(car.date, newDate, SZdate-1);
            car.date[SZdate-1]='\0';
            return true; // замена успешна
        }
    } 
    return false; // замена не произведена
}
 
vector<Car> generateListCar(vector<Car> &carList , const char *compareDate, const char *model) {
    vector<Car> res;
    for (const auto &car : carList)
    if ((strcmp(car.date, compareDate) == 0) && (strcmp(car.model, model) == 0))
        res.push_back(car);
    return res;
}
 
int main() {
    setlocale(LC_ALL, "Russian");
    vector<Car> dbase{
                             {"11-123-ABC", "BMW", "red", "Petrov-Petr-Msk-Stroiteley-21k1", "01.08.2022"},
                             {"23-120-CAW", "Lada", "black", "Petrov-Maksim-Msk-Stroiteley-22k1", "02.08.2022"},
                             {"66-154-WER", "Crysler", "yellow", "Petrov-Pavel-Msk-Stroiteley-23k1", "03.08.2022"},
                             {"41-178-MWD", "UAZ", "magenta", "Sidorov-Ivan-Msk-Stroiteley-24k2", "04.08.2022"},
                             {"78-223-MIG", "Crysler", "white", "Sidorov-Makar-Msk-Stroiteley-28k3", "03.08.2022"},
                             {"97-666-APO", "Crysler", "green", "Egorov-Nikita-Msk-Stroiteley-29k4", "03.08.2022"}
    };
    char num[] = "23-120-CAW";
    char newDate[] = "01.01.2022";
    if (replaceDate(dbase, num, newDate))
        cout << "Rreplace date for " << num << endl;
   
    char compareDate[] = "03.08.2022";
    char model[] = "Crysler";
 
    auto res = generateListCar(dbase, compareDate, model);
    if (!res.empty())
        for(const auto &rec : res){
            cout << rec.carNum  << ' ' << rec.model << ' ' << rec.color << ' ' << rec.infoForHolder << ' ' << rec.date << endl;
        }
    else
        cout << "Nothing found." << endl;
}
1
1 / 1 / 0
Регистрация: 19.03.2022
Сообщений: 99
16.11.2022, 01:34  [ТС]
Такс. Я увидел там много разных функций. Сейчас ещё чуть-чуть побьюсь головой об стенку и постараюсь разобраться как оно работает
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
16.11.2022, 01:49
Цитата Сообщение от daniil_novel Посмотреть сообщение
постараюсь разобраться как оно работает
Я это где-то два года разбирал.
Что бы уметь вертеть как хотеть.



Добавлено через 8 минут
Самописная функция для копирования строк с обрезанием.
Вместо strncpy. И ручного добавления нуля в конце.
C++
1
2
3
4
5
6
7
8
9
char* safecopy(char *dest, const char* src, size_t dest_size){
    size_t src_size = strlen(src);
    size_t i = 0;
    size_t end = dest_size > src_size ? src_size : dest_size-1;
    for ( ; i < end; ++i )
        dest[i] = src[i];
    dest[i]='\0';
    return dest;
}
Добавлено через 2 минуты
Конструктор с новой функцией, лучше ведь :
C++
1
2
3
4
5
6
7
    Car(const char* carNump, const char* modelp, const char* colorp, const char* infoForHolderp, const char* datep){
        safecopy(carNum, carNump, SZcerNum);
        safecopy(model, modelp, SZmodel);
        safecopy(color, colorp, SZcolor);
        safecopy(infoForHolder, infoForHolderp, SZinfoForHolder);
        safecopy(date, datep, SZdate);
    }
0
1 / 1 / 0
Регистрация: 19.03.2022
Сообщений: 99
16.11.2022, 02:54  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
Конструктор с новой функцией, лучше ведь :
Действительно штука красивая. Мне нравится

Добавлено через 5 минут
Цитата Сообщение от SmallEvil Посмотреть сообщение
Я это где-то два года разбирал.
Что бы уметь вертеть как хотеть.
Когда-то я даже неплохо шарил за это всё. В 10 классе написал игруху на чистом си, причем там несколько тысяч строк и около 40 самописных библиотек, даже мейкфайл и контроллер анимации свой. Если интересно, могу ссылочку на гит добавить. В общем потом я не программировал, к егэ готовился и т д. Теперь за два года универа прога упала ниже, чем даже в 10ом классе была. Знания дают очень поверхностные и не до конца. Слава богу хоть сейчас сел со всем разбираться сам. Надо на работу устроиться по плюсам, это очень хорошо помогает. Я так в своё время в C# очень нехило по юнити прокачался, а теперь вот ...
0
1 / 1 / 0
Регистрация: 19.03.2022
Сообщений: 99
18.11.2022, 18:59  [ТС]
Попробовал я сегодня сдать предыдущую задачу, которая была с файлами .txt. Преподша сказала, что условие до конца не выполнено. Там надо было разбить файл на три части и из него составить новое по условию. Но нигде не было указано, что делать, если файл состоит из такого количества чисел, которое не делится на 3. Мне сказала, надо разбить по частям так, чтобы в одной было больше на один. Я же вообще думал, что если в задании написано, что файл должен таким образом составляться, то он всегда будет нормально делиться на три части... В общем сейчас буду исправлять

Добавлено через 41 минуту
Цитата Сообщение от SmallEvil Посмотреть сообщение
Самописная функция для копирования строк с обрезанием.
У неё сигнатура - это safecopy(что копируем, куда копируем, сколько это весит), так?
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
18.11.2022, 19:08
Цитата Сообщение от daniil_novel Посмотреть сообщение
Мне сказала, надо разбить по частям так, чтобы в одной было больше на один.
А как разбить файл с одним символом ?
Вообще мне нравятся ТЗ со скрытыми условиями. Прям как в реале


Цитата Сообщение от daniil_novel Посмотреть сообщение
У неё сигнатура - это safecopy(что копируем, куда копируем, сколько это весит), так?
char* safecopy(char *dest, const char* src, size_t dest_size)
dest - строка назначения (куда копировать)
src - строка источник (откуда копировать)
dest_size - размер строки назначения.
Будет скопировано не более dest_size - 1 символов.

Возвращается указатель на строку назначения.

Вообще это все не столь важно. И не нужна она здесь особо.
Так как структура лишь хранилище данных, а не полноценный инкапсулированный класс.
Можно все оставить на код который будет с этой структурой работать.
Но такая функция может пригодится, а может и нет этому коду.
В зависимости от правил обработки вводных данных.
Разработкой этих правил, я, конечно, заниматься не буду.
0
1 / 1 / 0
Регистрация: 19.03.2022
Сообщений: 99
18.11.2022, 19:17  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
А как разбить файл с одним символом ?
Исходя из логики преподов, это то самое, почему я в следующий раз не смогу сдать эту работу. Походу символ надо делить на три и составлять из нолика букву "Ж"

Добавлено через 2 минуты
Цитата Сообщение от SmallEvil Посмотреть сообщение
И не нужна она здесь особо.
Ну почему же? Я сейчас пишу функцию, которая будет заполнять текстовый файл данными, которые в свою очередь будут храниться в структуре

Добавлено через 3 минуты
Цитата Сообщение от daniil_novel Посмотреть сообщение
Я сейчас пишу функцию, которая будет заполнять текстовый файл данными
Вообще условие как будто не отсюда опять.

  1. преобразование тестовых данных из текстового файла в двоичный файл;
  2. сохранение данных двоичного файла в текстовом, так, чтобы используя их можно было восстановить двоичный файл;
  3. вывод всех записей двоичного файла;
  4. доступ к записи по ее порядковому номеру в файле, используя механизм прямого доступа к записи в двоичном файле;
  5. удаление записи с заданным значением ключа, выполнить путем замены на последнюю запись.

Зачем вообще тут работа с файлами, если можем напрямую со структурой? Странно это
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
18.11.2022, 19:23
Цитата Сообщение от daniil_novel Посмотреть сообщение
И не нужна она здесь особо.
Ну почему же?
Потому что назначение этой функции, написанную мною, в том что бы применить одно единственное правило для всех входных данных и обезопасить код от ошибок.
Тем не менее, случай когда вводимая строка, например модель автомобиля, больше чем может вместить наше поле,
по моему "правилу" оно просто обрежется.
В реальности такие случаи недопустимы.
То есть коду который будет запрашивать данные для структуры (или читать их из текстового файла), придется все равно обрабатывать такие случаи. И должен это делать. Не взирая на то что safecopy() безопасно копирует строки, в контексте кода.
То есть, если взять и сказать, что наш код работы со стркутурой, и все другие коды, должны сами отрабатывать такие случаи, то и эта функция (safe) не нужна. Сгодится и strcpy с должными проверками.

Добавлено через 2 минуты
Вообщем для этой задачи я не вижу никакого смысла что то "мудрить" и усложнять.
Просто делаете все максимально топорно. Ctrl+C - Ctrl + V
0
1 / 1 / 0
Регистрация: 19.03.2022
Сообщений: 99
18.11.2022, 19:26  [ТС]
Как по мне, то, что данные обрезаются при выходе за отведенную им память, то это очень даже хорошо. Конкретно в нашем случае вообще неясно что может быть передано в функцию, поэтому такой подход весьма удобен
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
18.11.2022, 19:27
Цитата Сообщение от daniil_novel Посмотреть сообщение
Там надо было разбить файл на три части и из него составить новое по условию. Но нигде не было указано, что делать, если файл состоит из такого количества чисел, которое не делится на 3.
В своем коде я этот случай продумал, и если файл не делится на три, то второй файл не создается.
Так как к примеру : файл с двух чисел 100 200 .
делим его на три, целое число не получается, значит минимальная часть 1
1 - часть, размер 1 число (100)
2 - чвсть, размер 1 число (200)
3 - часть размер 0 (файл кончился) ()

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

Добавлено через 57 секунд
Это я все на пальцах написал, математически это тоже верно.
И давайте впредь, в одной теме обсуждать одну задачу.
0
1 / 1 / 0
Регистрация: 19.03.2022
Сообщений: 99
18.11.2022, 19:33  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
Просто делаете все максимально топорно. Ctrl+C - Ctrl + V
Это не прокатит. То есть может и прокатит, ток смысла в этом мало. Я ж по большей части научиться хочу, чем работу сдать. В любом случае я её рано или поздно, но сдам. Важно понять как оно работает и сделать по меньшей мере как правильно и без костылей. Этого и хочу, поэтому и пишу сам. С костылями можно было уже давно у одногрупников скопировать

Добавлено через 1 минуту
Цитата Сообщение от SmallEvil Посмотреть сообщение
И давайте впредь, в одной теме обсуждать одну задачу.
Хорошо

Добавлено через 2 минуты
Цитата Сообщение от SmallEvil Посмотреть сообщение
делим его на три, целое число не получается, значит минимальная часть 1
1 - часть, размер 1 число (100)
2 - чвсть, размер 1 число (200)
3 - часть размер 0 (файл кончился) ()
Я понял. Получается всё очень даже работает. Протестирую на разных примерах и тогда просто пропишу, что есть случаи, где невозможно выполнить задачу. По типу файла из 1 числа
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
18.11.2022, 19:34
Цитата Сообщение от daniil_novel Посмотреть сообщение
поэтому такой подход весьма удобен
Есть реальный случай, похожего правила при работе со строками.
В ФС (файловая система) FAT 16, имя файла могло иметь длину не более 8 символов.
В других ФС и более поздних, возможная длина имени увеличилась.
При копировании длинных имен на ФС FAT 16, с именами выше 8, применялся след случай.
C++
1
2
ExFileName1.txt -> exfile~1.txt
ExFileOtherName.txt -> exfile~2.txt
Точно не помню, но как то так.
0
1 / 1 / 0
Регистрация: 19.03.2022
Сообщений: 99
18.11.2022, 19:54  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
ExFileName1.txt -> exfile~1.txt
ExFileOtherName.txt -> exfile~2.txt
Капец неудобно. Это ж надо в голове держать как конкретно из этой системы в другие переводить
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
18.11.2022, 20:00
Цитата Сообщение от daniil_novel Посмотреть сообщение
Это ж надо в голове держать как конкретно из этой системы в другие переводить
Это делал менеджер файлов, автоматически, при копировании.
0
1 / 1 / 0
Регистрация: 19.03.2022
Сообщений: 99
21.11.2022, 02:42  [ТС]
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 Car {
    char carNum[SZcerNum];
    char model[SZmodel];
    char color[SZcolor];
    char infoForHolder[SZinfoForHolder];
    char date[SZdate];
    Car() :carNum{""}, model{""}, color{""}, infoForHolder{""}, date{""}{};
    Car(const char* carNump, const char* modelp, const char* colorp, const char* infoForHolderp, const char* datep) {
        safecopy(carNum, carNump, SZcerNum);
        safecopy(model, modelp, SZmodel);
        safecopy(color, colorp, SZcolor);
        safecopy(infoForHolder, infoForHolderp, SZinfoForHolder);
        safecopy(date, datep, SZdate);
    }
};
 
/*******************************  Основное задание  ***************************************/
 
int createBoolTxt(string fileName, string fileNameData) {
    ofstream itf(fileName);
    if(itf.is_open()) {
        fstream obf(fileNameData, ios::out | ios::binary);
        Car car; 
        while(!itf.eof()) {
 
            obf.write((char*)&car, sizeof(Car));
        }
        itf.close();
        obf.close();
        return 0;
    }
    return 1;
}
 
void NewFileBin(string namebf, int key, string namenewbf) {
    ifstream bf;
    bf.open(namebf, ios::binary);
    Сar сar; // Не понимаю почему, пишет, что здесь ошибка. Говорит, что идентификатор Car не объявлен
    fstream obf(namenewbf, ios::out | ios::binary);
    bf.read((char*)&сar, sizeof(Сar));
    while (!bf.eof()) {
        if (сar.key == key) {
            obf.write((char*)&сar, sizeof(Сar));
        }
        bf.read((char*)&сar, sizeof(Сar));
    }
    bf.close();
    obf.close();
}
Добавлено через 31 секунду
При этом в соседней функции он ни на что не ругается

Добавлено через 9 минут
Чудейснейшим образом всё поправилось
0
1 / 1 / 0
Регистрация: 19.03.2022
Сообщений: 99
27.11.2022, 23:10  [ТС]
А я стараюсь не теряться и снова утыкаюсь в стену.

Писал несколько часов "Основное задание", по которому требуется создать 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
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <cstring>
#include <fstream>
#include <algorithm> 
#include <vector>
 
/*  преобразование тестовых данных из текстового файла в двоичный файл;
 сохранение данных двоичного файла в текстовом, так, чтобы используя их можно было восстановить двоичный файл;
 вывод всех записей двоичного файла;
 доступ к записи по ее порядковому номеру в файле, используя механизм прямого доступа к записи в двоичном файле;
 удаление записи с заданным значением ключа, выполнить путем замены на последнюю запись.*/
 
 
 
 
using namespace std;
const int SZcerNum = 12;
const int SZmodel = 32;
const int SZcolor = 12;
const int SZinfoForHolder = 256;
const int SZdate = 12;
 
char* safecopy(char *dest, const char* src, size_t dest_size) {
    size_t src_size = strlen(src);
    size_t i = 0;
    size_t end = dest_size > src_size ? src_size : dest_size - 1;
    for(; i < end; ++i)
        dest[i] = src[i];
    dest[i] = '\0';
    return dest;
}
 
 
struct Car {
    char carNum[SZcerNum];
    char model[SZmodel];
    char color[SZcolor];
    char infoForHolder[SZinfoForHolder];
    char date[SZdate];
    int number;
    Car() :carNum{""}, model{""}, color{""}, infoForHolder{""}, date{""}, number{0}{};
    Car(const char* carNump, const char* modelp, const char* colorp, const char* infoForHolderp, const char* datep) {
        safecopy(carNum, carNump, SZcerNum);
        safecopy(model, modelp, SZmodel);
        safecopy(color, colorp, SZcolor);
        safecopy(infoForHolder, infoForHolderp, SZinfoForHolder);
        safecopy(date, datep, SZdate);
    }
};
 
/*******************************  Основное задание  ***************************************/
 
int createBoolTxt(string fileName, string fileNameData) {
    ofstream itf(fileName);
    if(itf.is_open()) {
        fstream obf(fileNameData, ios::out | ios::binary);
        Car car;
        while(!itf.eof()) {
 
            obf.write((char*)&car, sizeof(Car));
        }
        itf.close();
        obf.close();
        return 0;
    }
    return 1;
}
 
 
int textToBin(string textFile, string binFile) {// преобразование тестовых данных из текстового файла в двоичный файл
    ofstream bin(binFile, ios::binary);
    ifstream text(textFile);
    if(text.is_open() && bin.is_open()) {
        cout << "файлы открыты, продолжаем" << endl;
        char buffer = 0;
        while(text.get(buffer)) {
            text >> buffer;
            bin.write((char*)&buffer, sizeof(buffer));
        }
    }
    else
    {
        cout << "файл не открыт" << endl;
    }
 
    cout << "Готово, данные перенесены" << endl;
    bin.close();
    text.close();
    return 0;
}
 
void printBinFile(string fileName) { // вывод всех записей двоичного файла;
    ifstream bin(fileName, ios::in | ios::binary);
    if(bin.is_open()) {
        char buffer = 0;
        int buf = 0;
        bin >> buf;
        while(bin.get(buffer)) {
            bin >> buf;
        }
        printf("%d ", buf);
    }
    bin.close();
}
 
void newFileBin(string namebf, int number, string namenewbf) {
    ifstream bf;
    bf.open(namebf, ios::binary);
    Car car;
    fstream obf(namenewbf, ios::out | ios::binary);
    bf.read((char*)&car, sizeof(Car));
    while (!bf.eof()) {
        if (car.number == number) {
            obf.write((char*)&car, sizeof(Car));
        }
        bf.read((char*)&car, sizeof(Car));
    }
    bf.close();
    obf.close();
}
 
void deleteBin(string namebf, unsigned int n) {
    ifstream bf;
    bf.open(namebf, ios::binary);
    Car car;
    vector <Car> a;
    bf.read((char*)&car, sizeof(Car));
    int i = 1;
    while (!bf.eof()) {
        if (i != n) {
            a.push_back(car);
        }
        ++i;
        bf.read((char*)&car, sizeof(Car));
    }
    bf.close();
    ofstream nbf;
    nbf.open(namebf, ios::binary);
    for (int i = 0; i < a.size(); ++i) {
        nbf.write((char*)&a[i], sizeof(Car));
    }
    nbf.close();
}
 
/*******************************  Дополнительное задание  **************************************/
 
 
bool replaceDate(vector<Car> &carList, const char *num, const char *newDate) { // уверенно
    for(auto &car : carList) {
        if(strcmp(car.carNum, num) == 0) {
            strncpy(car.date, newDate, SZdate - 1);
            car.date[SZdate - 1] = '\0';
            return true; // замена успешна
        }
    }
    return false; // замена не произведена
}
 
vector<Car> generateListCar(vector<Car> &carList, const char *compareDate, const char *model) { // уверенно
    vector<Car> res;
    for(const auto &car : carList)
        if((strcmp(car.date, compareDate) == 0) && (strcmp(car.model, model) == 0))
            res.push_back(car);
    return res;
}
 
///////////////////////////////////////////////////////
 
int main() {
    setlocale(LC_ALL, "Russian");
//  textToBin("first.txt","second.dat");
    printBinFile("second.dat");
    //createBoolTxt("BoolFile.txt", "dataFile.dat");
    //newFileBin("Data.dat", 1, "NewData.dat");
    //deleteBin("Data.dat", 3);
    //vector<Car> dbase{
    //                       {"11-123-ABC", "BMW", "red", "Petrov-Petr-Msk-Stroiteley-21k1", "01.08.2022", 0},
    //                       {"23-120-CAW", "Lada", "black", "Petrov-Maksim-Msk-Stroiteley-22k1", "02.08.2022", 1},
    //                       {"66-154-WER", "Crysler", "yellow", "Petrov-Pavel-Msk-Stroiteley-23k1", "03.08.2022", 2},
    //                       {"41-178-MWD", "UAZ", "magenta", "Sidorov-Ivan-Msk-Stroiteley-24k2", "04.08.2022", 3},
    //                       {"78-223-MIG", "Crysler", "white", "Sidorov-Makar-Msk-Stroiteley-28k3", "03.08.2022", 4},
    //                       {"97-666-APO", "Crysler", "green", "Egorov-Nikita-Msk-Stroiteley-29k4", "03.08.2022", 5}
    //};
    //char num[] = "23-120-CAW";
    //char newDate[] = "01.01.2022";
    //if(replaceDate(dbase, num, newDate))
    //  cout << "Rreplace date for " << num << endl;
 
    //char compareDate[] = "03.08.2022";
    //char model[] = "Crysler";
 
    ////auto res = generateListCar(dbase, compareDate, model);
    //if(!res.empty())
    //  for(const auto &rec : res) {
    //      cout << rec.carNum << ' ' << rec.model << ' ' << rec.color << ' ' << rec.infoForHolder << ' ' << rec.date << endl;
    //  } else
    //      cout << "Nothing found." << endl;
 
}
Я так и не разобрался как делать так, чтобы можно было сворачивать и разворачивать код на киберфоруме, как складкой. Буду рад если скажете как.

А теперь собственно вопрос:
По заданию требуется реализовать сохранение данных двоичного файла в текстовом, так, чтобы используя их можно было восстановить двоичный файл. Вроооде как для этого существует data файл, но я в этом не уверен. Просто как так можно сохранить, чтобы потом восстановить в текстовый файл? По идее бинарник всегда будет конвертироваться в текстовый, ибо в одном ток цифры, а в другом вообще всё. В общем хочу понять вообще что это за сохранение такое и с чем его едят.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
28.11.2022, 00:09
Цитата Сообщение от daniil_novel Посмотреть сообщение
чтобы можно было сворачивать и разворачивать код на киберфоруме
Спойлер :
Миниатюры
Разработать программу управление двоичными файлами с записями фиксированной длины(структура и работа с ней)  
0
1 / 1 / 0
Регистрация: 19.03.2022
Сообщений: 99
28.11.2022, 01:30  [ТС]
За спойлер, как говорится, спасибо
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
28.11.2022, 01:47
Цитата Сообщение от daniil_novel Посмотреть сообщение
По заданию требуется реализовать сохранение данных двоичного файла в текстовом
Текстовые файлы, также имеют свое логичное форматирование.
Текстовые файлы с данными, это не тоже самое, что текстовые файлы с произвольным набором символов.

К сожалению, сути вопроса так и не понял.
0
1 / 1 / 0
Регистрация: 19.03.2022
Сообщений: 99
28.11.2022, 02:02  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
К сожалению, сути вопроса так и не понял.
Я тоже не особо понял((. В задании написано " сохранение данных двоичного файла в текстовом, так, чтобы используя их можно было восстановить двоичный файл". И один семинарист в курсе что это значит. Я спросил ребят, сказали что делали через дата файлы. А что вообще такое эти ваши дата-файлы и с чем их едят?И надо ли делать задание через них?

Добавлено через 1 минуту
Если бы в условии все было сразу понятно, у меня и вопросов было б меньше. Да и были бы они куда качественнее
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.11.2022, 02:02

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Взрослые отношения, и почему они не получаются
kumehtar 09.06.2026
Когда в детстве ребёнок не получает от родителей чего-то важного, он лишается не просто приятных переживаний, а основы для формирования определённых внутренних качеств и навыков. Если ребёнок не. . .
[golang] Worker Pool
alhaos 09.06.2026
Worker Pool Worker Pool — паттерн конкурентной обработки задач в Go. Суть: фиксированное количество горутин-воркеров читают задачи из общего канала и пишут результаты в общий канал результатов. . . .
[golang] Pipeline
alhaos 08.06.2026
Pipeline Pipeline — паттерн конкурентной обработки данных в Go. Суть: данные проходят через цепочку независимых стадий, каждая из которых работает в своей горутине и общается с соседями через. . .
Свет внутри себя
kumehtar 07.06.2026
Пусть это будет здесь lIs4oanZS9Y
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу. До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru