Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
3 / 3 / 0
Регистрация: 10.06.2016
Сообщений: 420

Запись и чтение структуры (целые числа)

19.10.2016, 19:55. Показов 2014. Ответов 19

Студворк — интернет-сервис помощи студентам
Есть структура:
C++
1
2
3
4
5
6
typedef struct
{
  unsigned int a;
  int b;
} VVV;
extern VVV vvv;
Есть функция записи структуры в бинарный файл:
void NWritedStruct(char *filename, size_t size, void *str)
C++
1
2
3
4
5
{
  FILE *f = fopen(filename,"wb");
  fwrite(str, size, 1, f);
  fclose(f);//закрыть файл
}
Есть функция чтения структуры из бинарного файла:
void ReadStruct2(char *filename, size_t size, void *str)
C++
1
2
3
4
5
{
  FILE *f = fopen(filename,"rb");
  fread(str, size, 1, f);
  fclose(f);
}
Используем: записываем и читаем
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void __fastcall TForm1::FormCreate(TObject *Sender)
{
  vvv.a=2148483648;
  vvv.b=-2146483648;
  //vvv.a=21484;
  //vvv.b=-2146;
 
  //Запись в бинарный файл
  NWritedStruct2("111.txt", sizeof(vvv), &vvv);
 
  //Чтение из бинарного файла
  char s[12], s1[5], s2[5];
  ReadStruct2("111.txt", sizeof(vvv), &vvv);
 
  //Смотрим на прочитанное
  ShowMessage("a = "+IntToStr(vvv.a)+
              "\nb = "+IntToStr(vvv.b));
}
Проблема:
Когда записываем маленькие числа vvv.a=21484 и vvv.b=-2146, то и читаем их же,
но если числа большие vvv.a=2148483648 и vvv.b=-2146483648, то читаем a=-2146483648 и b=-2146483648.
В файле 111.txt записано "40 42 0F 80 40 42 0F 80" два одинаковых числа, поэтому и читает одинаковые, но
почему записывает, как два одинаковых, хотя 'a' беззнаковое?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.10.2016, 19:55
Ответы с готовыми решениями:

Запись/чтение структуры целиком
как записать структуру одним разом грубо говоря на псевдо коде так: struct Struct { AnsiString g; AnsiString b; } main...

Запись/чтение структуры в файл
Необходимо записать, а потом прочесть структуру в/из файла. Структура Prog.h struct sBlack { AnsiString Pol1; AnsiString Pol5; ...

Запись/чтение структуры с полем типа String в бинарный файл
Доброго времени суток. Есть слудующая структура struct R { int Number; String Name; String Nick; String email;

19
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
19.10.2016, 20:13
IntToStr() не предназначена для unsigned int. Вроде бы есть UIntToStr() - попробуй.
0
3 / 3 / 0
Регистрация: 10.06.2016
Сообщений: 420
20.10.2016, 09:34  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
IntToStr() не предназначена для unsigned int. Вроде бы есть UIntToStr() - попробуй.
Как раз с выводом всё нормально. Записывает неверно.
Числа vvv.a=2148483648 и vvv.b=-2146483648 разные, но в файле 111.txt они одинаковы,
записано "40 42 0F 80 40 42 0F 80"
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
20.10.2016, 11:13
Инженер_3, делай как говорят. Эти два числа в двоичном виде идентичны. Просвещайся.
0
3 / 3 / 0
Регистрация: 10.06.2016
Сообщений: 420
20.10.2016, 22:16  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
Инженер_3, делай как говорят. Эти два числа в двоичном виде идентичны. Просвещайся.
Выдаёт ошибку:
E2268 Call to undefined function 'UIntToStr()'

Добавлено через 32 минуты
Разрешилось само собой:
C++
1
2
3
4
5
//Чтение из бинарного файла
  ReadStruct2("222.txt", sizeof(vvv), &vvv);
  char s[10];
  sprintf(s, "%u\n%d", vvv.a,vvv.b);
  ShowMessage(AnsiString(s));
Добавлено через 6 минут
Странно, что при char s[10]; сработало, там же 21 символ + '\0'.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
20.10.2016, 22:29
Цитата Сообщение от Инженер_3 Посмотреть сообщение
Выдаёт ошибку:
E2268 Call to undefined function 'UIntToStr()
У тебя какая версия Builder? Поищи там подходящую функцию в справке.
Цитата Сообщение от Инженер_3 Посмотреть сообщение
Странно, что при char s[10]; сработало
Что тут странного? Ты же модификатор %u указал - это и есть для unsigned int. Поставь %i и будет та же проблема.
0
3 / 3 / 0
Регистрация: 10.06.2016
Сообщений: 420
21.10.2016, 16:36  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
У тебя какая версия Builder?
У меня Builder6. Нет там такой функции.
Цитата Сообщение от nmcf Посмотреть сообщение
Что тут странного? Ты же модификатор %u указал - это и есть для unsigned int. Поставь %i и будет та же проблема.
А при чём тут модификатор? Странно, что длина объявленной переменной 10 байт, а туда запихиваю 22 байта, и лезет.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
21.10.2016, 17:27
Цитата Сообщение от Инженер_3 Посмотреть сообщение
У меня Builder6.
Это древняя версия, но и там должно быть что-то подобное.
Инженер_3, ты имя неудачное выбрал. И int, и unsigned int одинакового размера в байтах и ниакаких специальных различий у них нет. Знаковость и беззнаковость зависит от интерпретации, которая и задаётся с помощью %i, %u. То же самое с функциями.
Цитата Сообщение от Инженер_3 Посмотреть сообщение
Странно, что длина объявленной переменной 10 байт
Значит, выходишь за пределы массива. Тебе байтов жалко? Ну сделай 50 - точно хватит.
0
3 / 3 / 0
Регистрация: 10.06.2016
Сообщений: 420
30.10.2016, 13:02  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
Это древняя версия, но и там должно быть что-то подобное.
UIntToStr() нет ни в моём Билдере ни в инете вообще.
Цитата Сообщение от nmcf Посмотреть сообщение
Инженер_3, ты имя неудачное выбрал
Я по профессии инженер-конструктор, а программирование для облегчения монотонной части инженерной работы.
Цитата Сообщение от nmcf Посмотреть сообщение
Значит, выходишь за пределы массива. Тебе байтов жалко? Ну сделай 50 - точно хватит.
Мне не жалко, но обычно ошибка выскакивает, а здесь всё тихо сработало.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
30.10.2016, 15:52
Цитата Сообщение от Инженер_3 Посмотреть сообщение
UIntToStr() нет ни в моём Билдере ни в инете вообще
http://docwiki.embarcadero.com... .UIntToStr

Добавлено через 1 минуту
Ну или можешь использовать преобразование в вещественный формат.
0
3 / 3 / 0
Регистрация: 10.06.2016
Сообщений: 420
01.11.2016, 21:53  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
http://docwiki.embarcadero.com/Libra...tils.UIntToStr
Добавлено через 1 минуту
Ну или можешь использовать преобразование в вещественный формат.
И всё же UIntToStr() может где и есть, но ни Гугл, ни Яндекс ничего не выдают, и лучше по-простому - sprintf()
Я ещё раз убедился, что Си - это классика программирования.
0
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
02.11.2016, 07:55
Цитата Сообщение от Инженер_3 Посмотреть сообщение
Я ещё раз убедился, что Си - это классика программирования.
Мне кажется это как купить, примерно, лексус, но говорить, что жигуль - это классика автомобилестроения!
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
02.11.2016, 09:09
Цитата Сообщение от Инженер_3 Посмотреть сообщение
но ни Гугл, ни Яндекс ничего не выдают
В кавычки бери имя функции и получишь несколько ссылок, одну я тебе уже дал. Ещё раз: если твой Builder древний используй FloatToStr().
0
3 / 3 / 0
Регистрация: 10.06.2016
Сообщений: 420
03.11.2016, 12:07  [ТС]
Цитата Сообщение от d7d1cd Посмотреть сообщение
Мне кажется это как купить, примерно, лексус, но говорить, что жигуль - это классика автомобилестроения!
И хотя это не по теме, но в этом сущая правда - Жигуль можно ремонтировать в любом гараже, а Лексус только в сервисном центре.

Добавлено через 3 минуты
Цитата Сообщение от nmcf Посмотреть сообщение
В кавычки бери имя функции и получишь несколько ссылок, одну я тебе уже дал. Ещё раз: если твой Builder древний используй FloatToStr().
Так можно и через IntToStr(), но перед ним sprintf()
см.Сообщение №5
0
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
03.11.2016, 13:47
Цитата Сообщение от Инженер_3 Посмотреть сообщение
Жигуль можно ремонтировать в любом гараже, а Лексус только в сервисном центре.
В этой ситуации лучше быть умельцем сервисного центра.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
03.11.2016, 18:56
Цитата Сообщение от Инженер_3 Посмотреть сообщение
но перед ним sprintf()
Это лишние действия. Используй возможности Builder.
0
3 / 3 / 0
Регистрация: 10.06.2016
Сообщений: 420
10.11.2016, 15:41  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
Это лишние действия. Используй возможности Builder.
Использовать FloatToStr() ?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
10.11.2016, 16:04
Инженер_3, ты так долго к этому шёл? Я думал, уже всё сделано.
0
3 / 3 / 0
Регистрация: 10.06.2016
Сообщений: 420
15.11.2016, 14:18  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
Инженер_3, ты так долго к этому шёл? Я думал, уже всё сделано.
Я сделал ещё в сообщении:
Сообщение#5
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
15.11.2016, 17:21
Ты сделал с привлечением лишних сущностей. Если данные в String, то конвертировать их в древний формат, чтобы sprintf() использовать, а после назад - ни к чему.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.11.2016, 17:21
Помогаю со студенческими работами здесь

запись и чтение структуры данных в файл(объектная реализация)
Есть двухуровневая структура данных(линейная). Она построена на указателях. Из книги Лафоре: "Можно даже не пытаться произвести...

Чтение/запись структуры
День добрый! Помогите пожалуйста решить задачу: Сформировать текстовый файл, имеющий следующую структуру: фамилия, адрес, марка автомобиля,...

Чтение/запись структуры
Всем привет! Есть файл, в который записана структура. По сути это дерево и соответственно в каждом узле есть поле типа самого узла. Вот как...

Запись\чтение структуры в\из файл(а)
Никак не пойму как записать структуру в файл, а потом считать ее. Есть структура struct sklad { char nazva; int...

Запись структуры и её чтение из файла
пробовал разными способами, ничего не работает, не записывает и не считывает ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru