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

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

Восстановить пароль Регистрация
 
TimeToWork
4 / 4 / 0
Регистрация: 13.04.2013
Сообщений: 25
01.08.2013, 16:19     Почему запись int в файл происходит в обратном порядке? #1
Разбирался в способе сохранения структур в файле, наткнулся на вот такой пример:

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++
C++ error C2664: itoa: невозможно преобразовать параметр 1 из 'int *' в 'int' + запись в файл
Запись строк в обратном порядке. C++
C++ Найти ошибку. Запись строк в обратном порядке в другой файл
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11822 / 6801 / 769
Регистрация: 27.09.2012
Сообщений: 16,869
Записей в блоге: 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
Модератор
Эксперт С++
 Аватар для Croessmah
11822 / 6801 / 769
Регистрация: 27.09.2012
Сообщений: 16,869
Записей в блоге: 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
636 / 557 / 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
Модератор
Эксперт С++
 Аватар для Croessmah
11822 / 6801 / 769
Регистрация: 27.09.2012
Сообщений: 16,869
Записей в блоге: 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
Модератор
Эксперт С++
 Аватар для Croessmah
11822 / 6801 / 769
Регистрация: 27.09.2012
Сообщений: 16,869
Записей в блоге: 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
Модератор
Эксперт С++
 Аватар для Croessmah
11822 / 6801 / 769
Регистрация: 27.09.2012
Сообщений: 16,869
Записей в блоге: 2
Завершенные тесты: 1
01.08.2013, 18:16     Почему запись int в файл происходит в обратном порядке? #13
Почему запись int в файл происходит в обратном порядке?
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,126
Записей в блоге: 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++
C++ Считать массив байт в переменную типа int в обратном порядке
C++ Запись в обратном порядке элементов массива

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

Или воспользуйтесь поиском по форуму:
zer0mail
2185 / 1868 / 187
Регистрация: 03.07.2012
Сообщений: 6,640
Записей в блоге: 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 в файл происходит в обратном порядке?
Ответ Создать тему
Опции темы

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