Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
 Аватар для _Eldar_
45 / 30 / 11
Регистрация: 31.10.2009
Сообщений: 200

Запись в бинарник и его чтение

01.02.2010, 05:37. Показов 2334. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем, задача состоит в том, что нужно записать в бинарник сведения о сканерах и считать их из него. Проблема в том что нужно в первых 2-х байтах записать количество сканеров. Я сдвигаю курсор на 2 байта и начинаю запись сканеров, затем сдвигаю курсор в начало бинарника и записываю подсчитанное кол-во записей, но когда я читаю из бинарника количество записей (первые 2 байта) выходит примерно 82435947 Помогите пожалуйста, заранее благодарен
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
#include <stdio.h>
#include <windows.h>
 
const int l_mode = 25;
 
struct scan_info{
   char   model[l_mode+1]; //наименование модели
   int    price;           //цена
   double x_size;          //горизонтальный размер области сканирования
   double y_size;          //вертикальный размер области сканирования
   int    optr;            //оптическое разрешение
   int    grey;            //число градаций серого
} scan;
 
 
short int count_scan = 0; //количество записей
int write_bin();    //запись в бинарник
int read_bin(int number_row); //чтение из бинарника
 
int main(){
 
   SetConsoleCP(1251);
   SetConsoleOutputCP(1251);
   printf("%i",sizeof(count_scan));
   printf("\nВводим сканеры: ");
 
   write_bin();
 
   printf("\nВведите номер записи или 0, чтобы вывести все строки: ");
   int i;
   scanf("%i", &i);
 
   read_bin(i);
 
   return 0;
 
}
 
int write_bin(){
 
   FILE *f = fopen("D:\\C++\\lab\\Функции\\date_base.bin","wb");
   if(f == NULL){
      printf("Файл не создан\n");
      return 1;
   }
 
   fseek(f,sizeof(count_scan),SEEK_SET);
 
   while(1==1){
 
      printf("\nВведите модель: ");
      scanf("%s",&scan.model);
      for(int i = strlen(scan.model)+1; i <= l_mode; i++){
         scan.model[i] = ' ';
      }
      scan.model[l_mode+1] = '\0';
 
      printf("\nВведите цену: ");
      scanf("%i", &scan.price);
      printf("\nВведите горизонтальный размер области сканирования: ");
      scanf("%lf", &scan.x_size);
      printf("\nВведите вертикальный размер области сканирования: ");
      scanf("%lf", &scan.y_size);
      printf("\nВведите оптическое разрешение: ");
      scanf("%i", &scan.optr);
      printf("\nВведите число градаций серого: ");
      scanf("%i", &scan.grey);
 
      fwrite(&scan, sizeof(scan), 1, f);
      count_scan++;
 
      printf("\nПродолжить ввод? (y/n):  ");
      static char continie;
      scanf("%s",&continie);
      if(continie == 'n') break;
 
   }
   fseek(f,0,SEEK_SET);
   fwrite(&count_scan, sizeof(count_scan), 1, f);
   printf("\nБинарник записан");
   fclose(f);
   return 0;
}
 
int read_bin(int number_row){
 
   FILE *f = fopen("D:\\C++\\lab\\Функции\\date_base.bin","wb");
   if(f == NULL){
      printf("Файл не найден\n");
      return 1;
   }
   fseek(f,sizeof(count_scan),SEEK_SET);
   printf("\n%i",number_row);
   if(!number_row){
      for(int i = 1; i <=count_scan; i++){
         fread(&scan, sizeof(scan), 1,f);
         printf("\nНомер записи: %i\n%s\n%i\n%lf\n%lf\n%i\n%i\n\n",
                 i,
                 scan.model,
                 scan.price,
                 scan.x_size,
                 scan.y_size,
                 scan.optr,
                 scan.grey);
         fseek(f,sizeof(scan),SEEK_CUR);
      }
   }
   else{
      fseek(f,sizeof(scan)*number_row,SEEK_CUR);
      fread(&scan, sizeof(scan), 1,f);
      printf("\nНомер записи: %i\n%s\n%i\n%lf\n%lf\n%i\n%i\n\n",
                 number_row,
                 scan.model,
                 scan.price,
                 scan.x_size,
                 scan.y_size,
                 scan.optr,
                 scan.grey);
   }
   fseek(f,0,SEEK_SET);
   int count;
   fread(&count,sizeof(count_scan),1,f);
   printf("Количество записей: %i", count);
   fclose(f);
   return 0;
 
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.02.2010, 05:37
Ответы с готовыми решениями:

запись и чтение структуры в бинарник
как правильно записывать и считывать структуру из бинарника? при этом коде программа виснет сами структуры struct employee { ...

Чтение файла (текст+бинарник)
Нужно прочитать файл, заменить {CODE128} на сгенерированное число и отправить в порт принтера. Файл содержит управляющие команды (ASCII...

Запись структуры с строкой в бинарник
Здравствуйте, уважаемые форумчане! Интересовал вопрос записи структуры, в который есть string, в бинарный файл. Нашел на форуме код и...

21
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
01.02.2010, 08:20
C
1
2
    int count;
    fread(&count,sizeof(count_scan),1,f);
C
1
2
3
4
5
    int count;
    short t;
 
    fread(&t, sizeof(count_scan), 1, f);
    count = (unsigned short) t;
это если count необходимо в виде int
так-то short count;
1
 Аватар для _Eldar_
45 / 30 / 11
Регистрация: 31.10.2009
Сообщений: 200
01.02.2010, 08:50  [ТС]
accept, записал так :
C
1
2
3
   short int count;
   fread(&count,sizeof(count_scan),1,f);
   printf("Количество записей: %i", count);
теперь Количество записей: 12906 хотя я ввел всего 2 сканера

Добавлено через 2 минуты
accept, тоже самое если printf("Количество записей: %hi", count);
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
01.02.2010, 11:22
C++
1
FILE *f = fopen("D:\\C++\\lab\\Функции\\date_base.bin","wb");
чтения нет

тоже подвис, пока чтение не заметил

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
#include <stdio.h>
#include <stdlib.h>
 
int main(void) /* C89 ANSI */
{
    FILE *fp;
    short n, m;
    
    n = 300;
    m = 0;
    
    fp = fopen("file.txt", "wb+");
    
    fseek(fp, 2L, SEEK_SET);
    
    putc('a', fp);
    putc('b', fp);
 
    fseek(fp, 0L, SEEK_SET);
    
    fwrite(&n, sizeof n, 1, fp);
 
    putc('c', fp);
    putc('d', fp);
 
    fseek(fp, 0L, SEEK_SET);
 
    fread(&m, sizeof m, 1, fp);
    
    printf("%d" "\n", m);
    
    exit(EXIT_SUCCESS);
}
1
 Аватар для _Eldar_
45 / 30 / 11
Регистрация: 31.10.2009
Сообщений: 200
02.02.2010, 00:47  [ТС]
Да, я уже разобрался)) надо было поставить "rb", только мне не понятно, почему сканеры выводились на экран, ведь, когда я отрывал поток мой бинарник стерся) не выводилось только кол-во записей

Добавлено через 40 секунд
Спасибо за помощь
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
02.02.2010, 01:31
у тебя scan глобальная, файл стёрся, а на экран выводился последний сканер
0
 Аватар для _Eldar_
45 / 30 / 11
Регистрация: 31.10.2009
Сообщений: 200
02.02.2010, 01:33  [ТС]
в том то и дело что выводиться на экран не только одна)
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
02.02.2010, 01:38
C
1
2
    if (fread(&scan, sizeof(scan), 1, f) == 1)
        printf("read" "\n");
если читает с wb, это компилятор
0
 Аватар для _Eldar_
45 / 30 / 11
Регистрация: 31.10.2009
Сообщений: 200
02.02.2010, 02:09  [ТС]
Блин, у меня еще вывод корявый (( Ввел 3 записи, хочу вывести все строки read_bin(0), выводится первая и 2 раза третья, и вывести отдельно эту строку не могу read_bin(2), выводиться 1 раз третья

Добавлено через 6 минут
Ура!!!))) Нашел, я при записи забыл делать сдвиг в байтах fseek(f, sizeof(scan), SEEK_CUR);

Добавлено через 2 минуты
accept, мне только не понятно почему третья запись не записалась на первую тогда
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
02.02.2010, 02:36
C++
1
2
3
4
5
6
7
8
9
10
        fread(&scan, sizeof(scan), 1,f);
        printf("\nНомер записи: %i\n%s\n%i\n%lf\n%lf\n%i\n%i\n\n",
                 i,
                 scan.model,
                 scan.price,
                 scan.x_size,
                 scan.y_size,
                 scan.optr,
                 scan.grey);
        fseek(f,sizeof(scan),SEEK_CUR);
fread и так передвигает указатель, с fseek чтение будет через одну
1
 Аватар для _Eldar_
45 / 30 / 11
Регистрация: 31.10.2009
Сообщений: 200
02.02.2010, 04:39  [ТС]
Вот теперь все понятно СПАСИБО
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
02.02.2010, 07:53
там может ещё что-то быть, я просто не смотрел
0
 Аватар для _Eldar_
45 / 30 / 11
Регистрация: 31.10.2009
Сообщений: 200
02.02.2010, 07:54  [ТС]
Да нет, теперь все правильно работает))
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
02.02.2010, 10:19
C++
1
while(1==1){
а это что за прикол

C++
1
2
3
    static char continie;
    scanf("%s",&continie);
    if(continie == 'n') break;
вообще бесконечный цикл делают for ( ; ; )
но это не считается хорошим стилем, потому что нет очевидности выхода

cont лучше определить снаружи цикла и установить его в 'y'
а цикл сделать while (cont == 'y')

чтение переменной делается через cont = getchar();
у scanf'а %s даже в случае %1s сохраняет два символа (символ и нуль-символ)
то есть то, что компилятор не выпал - это просто везение (случайность), так как запись нуль-символа правее переменной типа char может привести к записи в запрещённую область
ладно, долго объяснять
0
 Аватар для _Eldar_
45 / 30 / 11
Регистрация: 31.10.2009
Сообщений: 200
03.02.2010, 01:41  [ТС]
а scanf разве не перезаписывает в переменную continie? , дело в том, что когда я ставил scanf("%c, &continie"), то программа вылетала, методом проб и ошибок поставил %s - заработало. Как работает getchar() ? можешь пример простенький привести?(тот же выход из цикла например).
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
03.02.2010, 02:54
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
#include <stdio.h>
#include <stdlib.h>
 
int main(void) /* C89 ANSI */
{
    int answer;
    enum { YES, NO } cont;
    
    cont = YES;
    
    while (cont == YES) {
 
        cont = NO;
        
        printf("continue (y/n)?" "\n");
        
        answer = getchar();
        
        while (getchar() != '\n')
            ;
        
        if (answer == 'y')
            cont = YES;
    
    }
    
    exit(EXIT_SUCCESS);
}
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[guest@station test]$ ./test
continue (y/n)?
yyy
continue (y/n)?
y
continue (y/n)?
y
continue (y/n)?
n
[guest@station test]$ ./test
continue (y/n)?
yyyn
continue (y/n)?
y
continue (y/n)?
nnn
[guest@station test]$
Добавлено через 2 минуты
getchar() - это аналогично scanf("%c", (char *) &answer);
0
 Аватар для _Eldar_
45 / 30 / 11
Регистрация: 31.10.2009
Сообщений: 200
03.02.2010, 03:29  [ТС]
а зачем преобразовывать ссылку как указатель на char ?scanf("%c", (char *) &answer) , чего то мы от темы отклонились

Добавлено через 1 минуту
что в этом выражении происходит? answer = getchar();

Добавлено через 46 секунд
такую запись вообще первый развижу exit(EXIT_SUCCESS);

Добавлено через 43 секунды
где старый добрый RETURN?

Добавлено через 2 минуты
и зачем здесь использовать перечисление enum { YES, NO } cont ?

Добавлено через 24 минуты
как может answer == 'y' если int answer;
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
03.02.2010, 03:45
Цитата Сообщение от _Eldar_
а зачем преобразовывать ссылку как указатель на char ?
потому что scanf принимает char *, а &answer имеет тип int *
если answer имеет тип char, тогда приведение не нужно
getchar может вернуть EOF в случае конца файла и в случае ошибки
но когда asnwer имеет тип char, EOF не будет означать EOF, потому что это может быть символ с кодом 0xFF
поэтому делают int (долго объяснять опять)

Цитата Сообщение от _Eldar_
что в этом выражении происходит? answer = getchar();
символ из потока ввода записывается в переменную answer
в случае ошибки в answer однозначно запишется EOF, в случае конца файла тоже (стандартный поток ввода - это файл на диске)
все символы ASCII положительные, а EOF отрицательный
поэтому символ 0xFF не будет отрицательным
(а в случае char answer; - будет, так как совпадёт с EOF)

Цитата Сообщение от _Eldar_
такую запись вообще первый развижу exit(EXIT_SUCCESS);
эта штука не делает просто return
её преимущество в том, что она заканчивает программу из любой функции
а return просто делает возврат из функции
EXIT_SUCCESS - это просто такой #define в заголовке stdlib.h
ну, я думаю, из перевода понятно, что он значит

Цитата Сообщение от _Eldar_
и зачем здесь использовать перечисление enum { YES, NO } cont
оно гораздо понятнее и читаемее, для него не нужно определять #define'ы или const int'ы
всё в одном
и cont касается только цикла
cont можно переключать любым действием, не только одним каким-то
Миниатюры
Запись в бинарник и его чтение  
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
03.02.2010, 03:53
Цитата Сообщение от _Eldar_
как может answer == 'y' если int answer;
легко
'y' - символьная константа
символьная константа равна числу, которое является кодом из символьной таблицы (ASCII например)
int может хранить число, которое помещается в sizeof(int) байт (в двоичном представлении)
'y' помещается в одном байте, то есть значение кода символа занимает один байт переменной типа int
0
 Аватар для _Eldar_
45 / 30 / 11
Регистрация: 31.10.2009
Сообщений: 200
03.02.2010, 03:55  [ТС]
Спасибо, теперь буду переваривать)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.02.2010, 03:55
Помогаю со студенческими работами здесь

Очень медленная запись в бинарник
Здравствуйте! Приходится писать большие бинарные файлы из 4-байтных чисел real (использую Intel Fortran+Visual Studio). Для этого...

Запись массива в файл и его чтение
Помогите, пожалуйста: надо записать в файл массив из, например, 10 элементов, вычисляющихся как f=f+1, например. Затем считать полученные...

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

Чтение текста из файла и запись его частей в переменные
Всем привет. Столкнулся с проблемой переноса ключей расшифровки. Одна программа генерирует ключи, записывает их в таком виде: 3|2|3 (могу...

Чтение текста из файла и запись его частей в переменные
Здравствуйте, задача такая - у меня есть текстовой документ, в который записаны фраза и ответ на эту фразу через разделитель - | ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru