Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 14.03.2016
Сообщений: 4

Написать функцию, которая записывает данные о сканере из приведенной структуры в требуемую позицию в бинарном файле

11.07.2017, 19:33. Показов 3341. Ответов 0

Студворк — интернет-сервис помощи студентам
Для хранения данных о планшетных сканерах описать структуру вида:
C
1
2
3
4
5
6
7
8
struct scan_info {
    char model[25];         // наименование модели
    int price;              // цена
    double x_size;          // горизонтальный размер области сканирования
    double y__size;         // вертикальный размер области сканирования
    int optr;               // оптическое разрешение
    int grey;               // число градаций серого
};
Написать функцию, которая записывает данные о сканере из приведенной структуры в требуемую позицию в бинарном файле. Структура файла: в первых двух байтах размещается значение типа 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
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
#include <conio.h>
#include <stdlib.h>
#include <cstring>
#include <memory>
 
 
struct scan_info {
    char model[25];         // наименование модели
    int price;              // цена
    double x_size;          // горизонтальный размер области сканирования
    double y__size;         // вертикальный размер области сканирования
    int optr;               // оптическое разрешение
    int grey;               // число градаций серого
};
 
const int min_records = 6;                                          //минимальное число записей для ввода (нулевые учитываются)
 
 
 
 
void PrintArray (scan_info* si, int count)                          //вывод записей на экран из массива
{
    for (int i=0; i<count; i++)
        printf ("\n%i. %s price: %i grey: %i", i+1, si[i].model, si[i].price, si[i].grey);
}
 
 
 
 
void PrintFromFile (char* fname)                                    //вывод записей на экран из файла
{
    FILE* f = fopen (fname, "rb");                                  //открываем файл
 
    short count;                                                    //читаем количество записей
 
    scan_info* si = new scan_info[count];                           //выделяем место под массив
    int k = fread (si, sizeof(scan_info), count, f);                    //считываем массив
 
    for (int i=0; i<count; i++) //выводим на экран
        printf ("\n%i. %s price: %i grey: %i", i+1, si[i].model, si[i].price, si[i].grey);
    fclose (f);
}
 
 
 
 
void OptimizeFile (char* fname)                                     //сжатие записей из файла
{
    FILE* f = fopen (fname, "r+b");                                 //открываем файл
 
    short count;                                                    //читаем количество записей
    int k = fread (&count, sizeof(short), 1, f);
 
    scan_info* si = new scan_info[count];                           //выделяем место под массив
    k = fread (si, sizeof(scan_info), count, f);                    //считываем массив
 
 
    PrintArray (si, count);                                         //выводим на экран для контроля
    
    fseek (f, sizeof(short), SEEK_SET);                             //переходим в начало файла, пропуская число записей
 
    short newcount = 0;                                             //число реальных записей
    scan_info nul;                                                  //нулевая запись для сравнения
    memset (&nul, 0, sizeof(nul));                                  //заполняем нулями
 
    for (int i=0; i<count; i++) {                                   //просмотриваем массив
        if (memcmp (&nul, &si[i], sizeof(scan_info))!=0) {          //Если запись не идентична нулевой
            k = fwrite (&si[i], sizeof(scan_info), 1, f);           //пишем запись в файл
            newcount++;                                             //наращиваем реальное количество
        }
    }
 
    fseek (f, 0, SEEK_SET);                                         //переходим в начало файла
    k = fwrite (&newcount, sizeof(short), 1, f);                    //пишем реальное количество записей
 
    fclose (f);                                                     //закрываем файл
 
    printf ("\nFile after optimization: \n");                       //выводим получившееся для контроля
    PrintFromFile (fname);
}
 
 
 
 
void CreateFile (char* fname)                                       //создание файла
{
    short n = 0;                                                    //количество записей
    int pos;
    scan_info si, nul;
    memset (&nul, 0, sizeof(nul));                                  //нулевая запись для пропусков заполняется нулями
    FILE* f = fopen (fname, "wb");
 
    int k = fwrite (&n, sizeof(short), 1, f);                       //пока пишем 0 в файл
 
    char c = 'y';                                                   //признак выхода из цикла
    while (c=='y') {                                                //вводим записи
        printf ("\nInput new record.\nInput model:\n");
        scanf ("%s", &si.model);
        printf ("\nInput price:\n");
        scanf ("%d", &si.price);
        printf ("\nInput horizontal size:\n");
        scanf ("%f", &si.x_size);
        printf ("\nInput vertical size:\n");
        scanf ("%f", &si.y__size);
        printf ("\nInput optical resolution:\n");
        scanf ("%d", &si.optr);
        printf ("\nInput shade of grey:\n");
        scanf ("%d", &si.grey);
        printf ("\nInput position to save (-1 for write to the end):\n");
        scanf ("%d", &pos);                                         //дополнительно спрашиваем позицию для сохранения
 
        n++;                                                        //наращиваем количество
        if (pos<0) pos = n;                                         //если ввели отрицательную позицию, пишем в конец файла
        if (pos>n) {                                                //если позиция дальше текущей
            fseek (f, (n-1)*sizeof(si)+sizeof(short), SEEK_SET);    //переставляем указатель в файле на текущее место
            while (pos>n) {                                         //пишем столько нулевых записей, сколько позиций надо пропустить
                fwrite (&nul, sizeof(nul), 1, f);
                n++;
            }
        } else if (pos<n) {                                         //если позиция раньше текущей
            n--;                                                    //не считаем эту запись - она займёт имеющееся место
            fseek (f, (pos-1)*sizeof(si)+sizeof(short), SEEK_SET);  //ставим указатель на нужное место
        } else                                                      //пишем на текущую позицию, ставим на неё указатель
            fseek (f, (n-1)*sizeof(si)+sizeof(short), SEEK_SET);
 
 
        k = fwrite (&si, sizeof(si), 1, f); //пишем запись в файл
 
        if (n>=min_records) {                                       //если 6 записей уже введено, то предлагаем прервать ввод
            printf ("\nPress \'y\', if you want to continue, or any other key, if you don\'t\n");
            c = getch();                                            //если будет введён не у, то выйдем из цикла
        }
    }
 
    fseek (f, 0, SEEK_SET);                                         //идём в начало файла
    k = fwrite (&n, sizeof(short), 1, f);                           //пишем реальное количество записей
    fclose (f);                                                     //закрываем файл
}
 
 
 
 
int main()
{                                                                   //пример
    CreateFile ("E:\\scans");                                       //создаём файл
    OptimizeFile ("E:\\scans");                                     //сортируем по цене
    return 0;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.07.2017, 19:33
Ответы с готовыми решениями:

Написать функцию,которая записывает в бинарный файл данные о сканере из приведённой стуктуры
Нужна помощь,решить следующую задачу: Все необходимые данные для ф-и должны передаваться им в качестве параметров.Использование...

Создать структуру и написать функцию, которая записывает в бинарный файл данные о сканере из структуры
Сама структура имеет вид: struct scan_info{ char model; // наименование модели int price; // цена double x_size; //...

Написать программу, которая записывает введенное слово в заданную позицию текстового файла
1.Разработать программу, которая осуществляет просмотр поточного каталогу и выводит на экран его содержание группами в порядке возрастания...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.07.2017, 19:33
Помогаю со студенческими работами здесь

В файл С записать четные числа из заданного файла, а в файл N - нечетные
3 разные программы : 1. В файле CN записаны целые числа.Написать программу которая в файле С записывает четные числа, а в файле...

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

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

Написать функцию, которая записывает числа 1,2,...N^2 в квадратную матрицу, располагая их по спирали
Не получается решить задание, мб кто-то сможет ...Нужен именно код, как это сделать... Написать функцию, которая записывает числа...

Написать программу, которая создает новый текстовый файл и записывает в него следующие данные
5. Написать программу, которая создает новый текстовый файл и записывает в него следующие данные (данные вводятся с клавиатуры): open ...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере 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 На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru