Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
TimeToWork
4 / 4 / 0
Регистрация: 13.04.2013
Сообщений: 25
#1

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

01.08.2013, 16:19. Просмотров 1168. Ответов 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 байта, проблема чисто с отображением символов. Как будто довольно большое множество символов не может отобразиться в блокноте и просто пропускается + некое тоже большое множество символов не может отобразиться и заменяется пробелами. Так ли это?
http://www.cyberforum.ru/cpp-beginners/thread1195411.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.08.2013, 16:19
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Почему запись int в файл происходит в обратном порядке? (C++):

Операции с файлами, запись массива в файл в обратном порядке
Собственно сабж! задача. Компоненты типизированного файла - целые числа....

Найти ошибку. Запись строк в обратном порядке в другой файл
Надо, чтобы с файла читались строки в обратном порядке в другой файл! #include...

Считать массив байт в переменную типа int в обратном порядке
Есть массив байт: char byData = {0x87, 0xd6, 0x12, 0x00}; Нужно считать его в...

error C2664: itoa: невозможно преобразовать параметр 1 из 'int *' в 'int' + запись в файл
Подскажите пожалуйста как быть... в конструктор приходит *int и мне нужно...

Дан файл целых чисел. Создать новый файл, содержащий те же элементы, что и исходный файл, но в обратном порядке
Пожалуйста, помогите решить задачу в C++!!! Дан файл целых чисел. Создать...

19
Croessmah
++Ͻ
14147 / 8072 / 1512
Регистрация: 27.09.2012
Сообщений: 19,910
Записей в блоге: 3
Завершенные тесты: 1
01.08.2013, 16:26 #2
Цитата Сообщение от TimeToWork Посмотреть сообщение
При этом размер файла всё равно 4 байта
50 == 0x00000032 так виднее?

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

00
00
00
32
А отображаются ровно 2 символа. А на число 10 ( = 0х0000000А ) отображаются 4 символа, причём из них 2 одинаковых закарлючки + 2 пробела. Странно это как-то (
0
aLarman
644 / 565 / 164
Регистрация: 13.12.2012
Сообщений: 2,112
Завершенные тесты: 1
01.08.2013, 17:17 #6
что странного Вы попросили 4 байта записать
C++
1
sizeof(int)
чему удивлятся то?
0
TimeToWork
4 / 4 / 0
Регистрация: 13.04.2013
Сообщений: 25
01.08.2013, 17:40  [ТС] #7
при записи 0x00000032 отображаются 2 символа
при записи 0х0000000А отображаются 4 символа
Цитата Сообщение от aLarman Посмотреть сообщение
что странного Вы попросили 4 байта записать
ну да, и при записи 4 байт 0х0000000А мы получили 2 символа с графическим отображением ОТОБР_1 и 2 символа с графическим отображением ОТОБР_2. Тобишь из 4 байт 2 попали в одно множество байт (для которых срабатывает отображение вида ОТОБР_1) и 2 в другое множество байт (для которых срабатывает отображение вида ОТОБР_2). Вам это не кажется странным для числа 0х0000000А ?
0
Croessmah
++Ͻ
14147 / 8072 / 1512
Регистрация: 27.09.2012
Сообщений: 19,910
Записей в блоге: 3
Завершенные тесты: 1
01.08.2013, 17:43 #8
Цитата Сообщение от TimeToWork Посмотреть сообщение
при записи 0х0000000А отображаются 4 символа
Файл бинарный! Откройте в Hex-редакторе и посмотрите
1
TimeToWork
4 / 4 / 0
Регистрация: 13.04.2013
Сообщений: 25
01.08.2013, 18:02  [ТС] #9
Цитата Сообщение от Croessmah Посмотреть сообщение
Файл бинарный!
это понятно, интересно Ваше мнение по поводу того, что написано далее в моём предыдущем посте в данной теме.
0
Croessmah
++Ͻ
14147 / 8072 / 1512
Регистрация: 27.09.2012
Сообщений: 19,910
Записей в блоге: 3
Завершенные тесты: 1
01.08.2013, 18:07 #10
Цитата Сообщение от TimeToWork Посмотреть сообщение
что написано далее в моём предыдущем посте в данной теме.
Почему запись int в файл происходит в обратном порядке?
1
TimeToWork
4 / 4 / 0
Регистрация: 13.04.2013
Сообщений: 25
01.08.2013, 18:13  [ТС] #11
Цитата Сообщение от Croessmah Посмотреть сообщение
А можете ещё, пожалуйста, выложить подобный скрин для 0х0000000А ? (число 10). Способ его отображения уж оочень странный.
0
novi4ok
551 / 504 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
01.08.2013, 18:13 #12
Цитата Сообщение от TimeToWork Посмотреть сообщение
Вам это не кажется странным для числа 0х0000000А ?
еще и как кажется! уж эти байты! (а говорят, бывают еще бииииты!!! сам не видел, но люди знащие утверждают, что они существуют ...)
0
Croessmah
++Ͻ
14147 / 8072 / 1512
Регистрация: 27.09.2012
Сообщений: 19,910
Записей в блоге: 3
Завершенные тесты: 1
01.08.2013, 18:16 #13
Почему запись int в файл происходит в обратном порядке?
1
Evg
Эксперт CАвтор FAQ
18937 / 6898 / 512
Регистрация: 30.03.2009
Сообщений: 19,432
Записей в блоге: 30
01.08.2013, 20:36 #14
Цитата Сообщение от TimeToWork Посмотреть сообщение
Открываем файл, и видим так "dcba". Почему так?
Почитай, что такое "little endian" и "big endian". Процессор, который стоит на твоём компе имеет little enaidn, а потому у него образ всех значений в памяти развёрнутый по отношению к тому, как это привык видеть человек

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

Не по теме:

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

0
Evg
01.08.2013, 20:51
  #16

Не по теме:

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

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

0
Toshkarik
01.08.2013, 20:57
  #17

Не по теме:

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

0
Croessmah
01.08.2013, 21:11
  #18

Не по теме:

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

0
Evg
01.08.2013, 22:46
  #19

Не по теме:

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

0
zer0mail
2451 / 2085 / 216
Регистрация: 03.07.2012
Сообщений: 7,566
Записей в блоге: 1
02.08.2013, 09:38 #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).
2
02.08.2013, 09:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.08.2013, 09:38
Привет! Вот еще темы с решениями:

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

Запись в обратном порядке элементов массива
Дан массив целых чисел А (20). Записать в обратном порядке элементы массива с...

Запись двухмерного массива в обратном порядке
Сообственно нужно записать массив в обратном порядке. Все перелазил к сожалению...

Подскажите, как запись строки в обратном порядке?
Подскажите запись строки в обратном порядке.


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru