Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
TimeToWork
4 / 4 / 0
Регистрация: 13.04.2013
Сообщений: 25
#1

Почему запись int в файл происходит в обратном порядке? - C++

01.08.2013, 16:19. Просмотров 990. Ответов 19
Метки нет (Все метки)

Разбирался в способе сохранения структур в файле, наткнулся на вот такой пример:

C++
1
2
3
4
5
6
7
int a = 'abcd';
 
FILE* WriteFile;
char WriteFileName[100] = "D:\\filename.txt";
WriteFile = fopen (WriteFileName,"wb");
fwrite(&a, sizeof(int), 1, WriteFile);
fclose (WriteFile);
Открываем файл, и видим так "dcba". Почему так? (с самой записью всё нормально, число можно потом считать, оно будет тем же, что и при записи).

И второй вопрос. Почему иногда int отображается 4 символа в файле (что логично, ибо sizeof(int) = 4, sizeof(char) = 1), но в то же время иногда отображается 2 символа в файле (например, при
C++
1
int a = 50; // код символа '2'
файл выглядит как "2 ".

При этом размер файла всё равно 4 байта, проблема чисто с отображением символов. Как будто довольно большое множество символов не может отобразиться в блокноте и просто пропускается + некое тоже большое множество символов не может отобразиться и заменяется пробелами. Так ли это?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.08.2013, 16:19     Почему запись int в файл происходит в обратном порядке?
Посмотрите здесь:

Операции с файлами, запись массива в файл в обратном порядке C++
C++ Дан символьный файл f. Записать в файл g элементы файла f в обратном порядке
Дан символьный файл f. Записать в файл g компоненты файла f в обратном порядке C++
C++ error C2664: itoa: невозможно преобразовать параметр 1 из 'int *' в 'int' + запись в файл
Запись строк в обратном порядке. C++
C++ Найти ошибку. Запись строк в обратном порядке в другой файл
Почему не происходит запись в файл? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
 Аватар для Croessmah
12535 / 7097 / 797
Регистрация: 27.09.2012
Сообщений: 17,515
Записей в блоге: 2
Завершенные тесты: 1
01.08.2013, 16:26     Почему запись int в файл происходит в обратном порядке? #2
Цитата Сообщение от TimeToWork Посмотреть сообщение
При этом размер файла всё равно 4 байта
50 == 0x00000032 так виднее?

Цитата Сообщение от TimeToWork Посмотреть сообщение
Открываем файл, и видим так "dcba". Почему так?
Записываете побайтно, а никто Вам не гарантирует прямой порядок байт, так что это зависит от реализации
TimeToWork
4 / 4 / 0
Регистрация: 13.04.2013
Сообщений: 25
01.08.2013, 16:46  [ТС]     Почему запись int в файл происходит в обратном порядке? #3
Цитата Сообщение от Croessmah Посмотреть сообщение
50 == 0x00000032 так виднее?
Почему эти нули (точнее, символы им соответствующие) не видно в блокноте?
Croessmah
Модератор
Эксперт CЭксперт С++
 Аватар для Croessmah
12535 / 7097 / 797
Регистрация: 27.09.2012
Сообщений: 17,515
Записей в блоге: 2
Завершенные тесты: 1
01.08.2013, 16:48     Почему запись int в файл происходит в обратном порядке? #4
Цитата Сообщение от TimeToWork Посмотреть сообщение
не видно в блокноте?
у них может и не быть графического изображения.
TimeToWork
4 / 4 / 0
Регистрация: 13.04.2013
Сообщений: 25
01.08.2013, 16:55  [ТС]     Почему запись int в файл происходит в обратном порядке? #5
так то оно так, но
50 == 0x00000032

00
00
00
32
А отображаются ровно 2 символа. А на число 10 ( = 0х0000000А ) отображаются 4 символа, причём из них 2 одинаковых закарлючки + 2 пробела. Странно это как-то (
aLarman
640 / 561 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
01.08.2013, 17:17     Почему запись int в файл происходит в обратном порядке? #6
что странного Вы попросили 4 байта записать
C++
1
sizeof(int)
чему удивлятся то?
TimeToWork
4 / 4 / 0
Регистрация: 13.04.2013
Сообщений: 25
01.08.2013, 17:40  [ТС]     Почему запись int в файл происходит в обратном порядке? #7
при записи 0x00000032 отображаются 2 символа
при записи 0х0000000А отображаются 4 символа
Цитата Сообщение от aLarman Посмотреть сообщение
что странного Вы попросили 4 байта записать
ну да, и при записи 4 байт 0х0000000А мы получили 2 символа с графическим отображением ОТОБР_1 и 2 символа с графическим отображением ОТОБР_2. Тобишь из 4 байт 2 попали в одно множество байт (для которых срабатывает отображение вида ОТОБР_1) и 2 в другое множество байт (для которых срабатывает отображение вида ОТОБР_2). Вам это не кажется странным для числа 0х0000000А ?
Croessmah
Модератор
Эксперт CЭксперт С++
 Аватар для Croessmah
12535 / 7097 / 797
Регистрация: 27.09.2012
Сообщений: 17,515
Записей в блоге: 2
Завершенные тесты: 1
01.08.2013, 17:43     Почему запись int в файл происходит в обратном порядке? #8
Цитата Сообщение от TimeToWork Посмотреть сообщение
при записи 0х0000000А отображаются 4 символа
Файл бинарный! Откройте в Hex-редакторе и посмотрите
TimeToWork
4 / 4 / 0
Регистрация: 13.04.2013
Сообщений: 25
01.08.2013, 18:02  [ТС]     Почему запись int в файл происходит в обратном порядке? #9
Цитата Сообщение от Croessmah Посмотреть сообщение
Файл бинарный!
это понятно, интересно Ваше мнение по поводу того, что написано далее в моём предыдущем посте в данной теме.
Croessmah
Модератор
Эксперт CЭксперт С++
 Аватар для Croessmah
12535 / 7097 / 797
Регистрация: 27.09.2012
Сообщений: 17,515
Записей в блоге: 2
Завершенные тесты: 1
01.08.2013, 18:07     Почему запись int в файл происходит в обратном порядке? #10
Цитата Сообщение от TimeToWork Посмотреть сообщение
что написано далее в моём предыдущем посте в данной теме.
Почему запись int в файл происходит в обратном порядке?
TimeToWork
4 / 4 / 0
Регистрация: 13.04.2013
Сообщений: 25
01.08.2013, 18:13  [ТС]     Почему запись int в файл происходит в обратном порядке? #11
Цитата Сообщение от Croessmah Посмотреть сообщение
А можете ещё, пожалуйста, выложить подобный скрин для 0х0000000А ? (число 10). Способ его отображения уж оочень странный.
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
01.08.2013, 18:13     Почему запись int в файл происходит в обратном порядке? #12
Цитата Сообщение от TimeToWork Посмотреть сообщение
Вам это не кажется странным для числа 0х0000000А ?
еще и как кажется! уж эти байты! (а говорят, бывают еще бииииты!!! сам не видел, но люди знащие утверждают, что они существуют ...)
Croessmah
Модератор
Эксперт CЭксперт С++
 Аватар для Croessmah
12535 / 7097 / 797
Регистрация: 27.09.2012
Сообщений: 17,515
Записей в блоге: 2
Завершенные тесты: 1
01.08.2013, 18:16     Почему запись int в файл происходит в обратном порядке? #13
Почему запись int в файл происходит в обратном порядке?
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
17192 / 5446 / 337
Регистрация: 30.03.2009
Сообщений: 14,792
Записей в блоге: 26
01.08.2013, 20:36     Почему запись int в файл происходит в обратном порядке? #14
Цитата Сообщение от TimeToWork Посмотреть сообщение
Открываем файл, и видим так "dcba". Почему так?
Почитай, что такое "little endian" и "big endian". Процессор, который стоит на твоём компе имеет little enaidn, а потому у него образ всех значений в памяти развёрнутый по отношению к тому, как это привык видеть человек

Цитата Сообщение от Croessmah Посмотреть сообщение
Записываете побайтно, а никто Вам не гарантирует прямой порядок байт, так что это зависит от реализации
Тебя почяитать, так содержимое файла зависит от положения звёзд на небе. Разработчик процессора гарантирует. На любой машине little endian будет "обратная" запись. На любой машине big endian будет "прямая" запись
Croessmah
01.08.2013, 20:40
  #15

Не по теме:

Цитата Сообщение от Evg Посмотреть сообщение
Разработчик процессора гарантирует. На любой машине little endian будет "обратная" запись.
А это?
Цитата Сообщение от Croessmah Посмотреть сообщение
так что это зависит от реализации

Evg
01.08.2013, 20:51
  #16

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
А это?
Стесняюсь спросить, от реализации ЧЕГО это зависит?

Просто человек задал конкретный вопрос, на который есть конкретный ответ, а не эфимерное "зависит от реализации"

Toshkarik
01.08.2013, 20:57
  #17

Не по теме:

От реализации процессора

Croessmah
01.08.2013, 21:11
  #18

Не по теме:

Цитата Сообщение от Evg Посмотреть сообщение
Стесняюсь спросить, от реализации ЧЕГО это зависит?
Цитата Сообщение от Evg Посмотреть сообщение
Разработчик процессора гарантирует.
Он гарантирует, а вот с точки зрения языка это будет уже зависеть от конкретной платформы.

Evg
01.08.2013, 22:46
  #19

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
Он гарантирует, а вот с точки зрения языка это будет уже зависеть от конкретной платформы.
У ТС'а вообще-то вполне конкретная платформа и ТС спросил, почему на его конкретной платформе имел место быть такой вот эффект

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.08.2013, 09:38     Почему запись int в файл происходит в обратном порядке?
Еще ссылки по теме:

C++ Считать массив байт в переменную типа int в обратном порядке
C++ Подскажите, как запись строки в обратном порядке?
C++ Запись в обратном порядке элементов массива
C++ Написать программу-обработчик запись слов в обратном порядке
Запись двухмерного массива в обратном порядке C++

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

Или воспользуйтесь поиском по форуму:
zer0mail
2309 / 1935 / 192
Регистрация: 03.07.2012
Сообщений: 6,938
Записей в блоге: 1
02.08.2013, 09:38     Почему запись int в файл происходит в обратном порядке? #20
Если не предпринимать специальных усилий, данные из памяти в файл пишутся в том же порядке, как они находятся в памяти. Например, есть структура:
C
1
2
3
4
5
6
7
8
9
10
11
12
struct st{
char c1='a';
char c2='b';
char m[4]={'c','d','e','f');
short int i=0x1234; // 2 байта
int n=0x12345678; // 4 байта
}
В памяти побайтно будет записано так: 
адреса -  x,x+1,x+2,...,x+11
1. 'a','b','c','d','e','f',0x34,0x12,0x78,0x56,0x34,0x12
или так:
2. 'a','b','c','d','e','f',0x12,0x34,0x12,0x34,0x56,0x78
1-й вариант для компьютеров с архитектурой типа intel x86 (ОС - Windows, например), в которых многобайтовые числа расположены в памяти так, что младшие разряды имеют меньший адрес, а старшие - больший.
2-й вариант для компьютеров с архитектурой типа Sparc (ОС -UNIX, например), в которых многобайтовые числа расположены в памяти так, что младшие разряды имеют больший адрес, а старшие - меньший.


Символ Unicode (русская 'A' - 0x0441 ) рассматривается не как массив из 2-х байтов, а как 16 (или 32) -битовое число, поэтому при записи 'A' в файл в формате UTF-16 для Windows в файл запишутся байты 0x41, 0x04 (этот формат называется UTF-16LE, те. Little Endian), а для Unix запишутся байты 0x04, 0x41 (этот формат называется UTF-16BE, те. Big Endian).

Если нужно, чтобы данные передавались в определенном порядке, не зависящем от архитектуры компьютера (например, при передаче по сети), то обеспечивать передачу/прием многобайтовых элементов "нужным концом" надо вручную (библиотеки TCP/IP делают это правильно и для Windows и для Unix).
Yandex
Объявления
02.08.2013, 09:38     Почему запись int в файл происходит в обратном порядке?
Ответ Создать тему
Опции темы

Текущее время: 21:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru