Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чем отличаются "обычные" файлы от бинарных? 
:(
    Опции темы
Alexey91
  Дата 28.10.2011, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 195
Регистрация: 18.9.2008

Репутация: нет
Всего: нет



Здравствуйте!

Кто-нибудь может объяснить отличия этих типов файлов?
PM   Вверх
newbee
Дата 28.10.2011, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 24.8.2011

Репутация: 3
Всего: 19



Ничем не отличаются кроме расширения и MIME. Но в винде при открытии файла в текстовом режиме часть даных может быть интерпретирована и ты получишь не совсем то, что читал (или записывал).


--------------------
You're face to face
With man who sold the world
PM   Вверх
bsa
Дата 28.10.2011, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(newbee @  28.10.2011,  11:26 Найти цитируемый пост)
Но в винде при открытии файла в текстовом режиме часть даных может быть интерпретирована и ты получишь не совсем то, что читал (или записывал). 

Другими словами, виндовая функция чтения при открытии файла в текстовом режиме конвертирует комбинацию символов "\r\n" в "\n". Таким образом, правильно работающий код под любым Unix при переносе в Windows может начать глючить, так как в *nix концом строки является именно '\n', а не пара '\r\n'
PM   Вверх
500mhz
Дата 28.10.2011, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: 1
Всего: 14



Цитата

виндовая функция чтения при открытии файла в текстовом режиме конвертирует комбинацию символов "\r\n" в "\n"

опа  ) это что за магическая функция такая?


--------------------

PM MAIL ICQ   Вверх
bsa
Дата 28.10.2011, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(500mhz @  28.10.2011,  14:38 Найти цитируемый пост)
опа  ) это что за магическая функция такая? 

read и fread.
PM   Вверх
500mhz
Дата 28.10.2011, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: 1
Всего: 14



у венды нет таких функций


--------------------

PM MAIL ICQ   Вверх
alexvs11
Дата 28.10.2011, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 21.8.2010

Репутация: 2
Всего: 10



Цитата(500mhz @  28.10.2011,  22:01 Найти цитируемый пост)
у венды нет таких функций

все fgets, fgetc, ... ?
PM MAIL   Вверх
500mhz
Дата 28.10.2011, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: 1
Всего: 14



ето сишные функции а не виндовые


--------------------

PM MAIL ICQ   Вверх
volatile
Дата 28.10.2011, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



500mhz, скажем так, сишные функции в венде, ведут себя не так, как сишные функции не в венде.  smile 

Кроме \n \r, есть еще несколько управляющих символов, которые в текстовом файле ведут себя не так как в бинарном.
Например 0x1a - конец файла. Если в файле открытом в текстовом режиме встретится такой байт, функция чтения вернет конец файла, даже если после этого байта есть еще пару гигабайт.
В принципе это и не в венде должно так быть..., линуксоды поправят, если что..




PM MAIL   Вверх
Lols
Дата 29.10.2011, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 144
Регистрация: 21.10.2011

Репутация: нет
Всего: нет



А что можно сделать, чтобы винда корректно все выдавала? :(
Не хочу юникс...
PM MAIL   Вверх
500mhz
Дата 29.10.2011, 00:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: 1
Всего: 14



Цитата

А что можно сделать, чтобы винда корректно все выдавала? :(

Забить на сишные вызовы и использовать WinApi 


--------------------

PM MAIL ICQ   Вверх
volatile
Дата 29.10.2011, 01:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(Lols @  29.10.2011,  00:37 Найти цитируемый пост)
А что можно сделать, чтобы винда корректно все выдавала? 

А она корректно выдает. Это сделано исключительно для удобства программистов.
иначе бы пришлось все выводить с двумя символами, например: printf ("строка\r\n");
В винапи, походу так и пишут, везде где нужен перевод строки, вставляют \r\n
Си в этом отношении удобней.


PM MAIL   Вверх
500mhz
Дата 29.10.2011, 01:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: 1
Всего: 14



ниче если я вас разочарую ?

Код

invoke MessageBox,0,txt,"Венда рулит",0
invoke ExitProcess,0
    txt:
        db    "Первая строка",0xd
        db    "Вторая строка",0


угадайте что получим в месадж боксе


--------------------

PM MAIL ICQ   Вверх
volatile
Дата 29.10.2011, 01:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



500mhz, Вы меседж бокс используете в качестве статического анализатора кода?  smile 



Это сообщение отредактировал(а) volatile - 29.10.2011, 01:55
PM MAIL   Вверх
500mhz
Дата 29.10.2011, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: 1
Всего: 14



ага )



--------------------

PM MAIL ICQ   Вверх
xvr
Дата 31.10.2011, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(Lols @  29.10.2011,  00:37 Найти цитируемый пост)
А что можно сделать, чтобы винда корректно все выдавала? :(

Использовать бинарный режим при открытии/создании файлов. Он на то и делался  smile 

PM MAIL   Вверх
Twelves
Дата 1.11.2011, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 22.6.2011

Репутация: нет
Всего: нет



А что на счет бинарного режима в юникс? там же все файлы вроде считаются текстовыми? <извините, просто опыта работы с никс системами у меня нет>
PM MAIL   Вверх
bsa
Дата 1.11.2011, 19:46 (ссылка) |  (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(Twelves @  1.11.2011,  20:27 Найти цитируемый пост)
А что на счет бинарного режима в юникс? там же все файлы вроде считаются текстовыми? <извините, просто опыта работы с никс системами у меня нет> 
я же вроде уже написал. нет там отличий между двоичным и текстовым файлом.
Язык С пришел из мира UNIX (именно для написания самого юникса он и создавался). В юниксе конец строки что в коде, что в файлах не отличается - это символ '\n'. А вот в MSDOS его создатель пошел другим путем - он сделал конец строки состоящим из двух последовательных байт "\r\n". Так как по стандарту языка С требуется, чтобы строки заканчивались на '\n', то функции чтения некоторых ОС (Windows, DOS и к ним приближенных) заменяют последовательность символов \r\n на \n, а функции записи в файл производят обратную операцию. Но эта операция может повредить двоичные данные, поэтому в этих ОС (и только в них) был введен специальный режим - двоичный, который активируется добавлением флага O_BINARY в функцию open или "b" в fopen. В UNIX этих флагов вообще нет, поэтому программист обязан окружать использование этого флага #ifdef _WIN32/#endif
PM   Вверх
500mhz
Дата 1.11.2011, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: 1
Всего: 14



bsa
ну что вы куйню пишете как лузер последний а? 
Цитата

В юниксе конец строки что в коде, что в файлах не отличается - это символ '\n'

в каком нафиг коде ? 
wiki
и не надо путать теплое с мягким, ОС и С lib это разные весчи. 
в ОС нет понятия текстовый или бинарный файл, ей все равно.

гуглите параметры для sys_create (nix) и CreateFile (win)


--------------------

PM MAIL ICQ   Вверх
xvr
Дата 1.11.2011, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(bsa @  1.11.2011,  19:46 Найти цитируемый пост)
который активируется добавлением флага O_BINARY в функцию open или "b" в fopen. В UNIX этих флагов вообще нет,

Вообще то есть, но все функции работы с файлами его игнорируют. Так что #ifdef не нужны


PM MAIL   Вверх
bsa
Дата 1.11.2011, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(500mhz @ 1.11.2011,  22:10)
bsa
ну что вы куйню пишете как лузер последний а? 
Цитата

В юниксе конец строки что в коде, что в файлах не отличается - это символ '\n'

в каком нафиг коде ? 
wiki
и не надо путать теплое с мягким, ОС и С lib это разные весчи. 
в ОС нет понятия текстовый или бинарный файл, ей все равно.

гуглите параметры для sys_create (nix) и CreateFile (win)

 ! 
bsa
Предупреждаю, оскорбления запрещены на форуме


Может мы с тобой еще на уровень машинных кодов опустимся? Зачем новичка грузить "ОС" или "libc"? Тем более, что в стандарте языка С нет ни sys_create, ни CreateFile. Поэтому их мы не обсуждаем.
По поводу конца строки, возможно, я не так выразился. Поэтому следует читать "символ разрыва строки" вместо "символ конца строки".

P.S.: возможно, это и непонятно, но для системы нет отличий, текстовый файл или нет. Все проблемы вытекают только из-за представления разрыва строки в разных ОС. Именно поэтому требуется указывать при открытии файла, что за содержимое в нем.
PM   Вверх
math64
Дата 2.11.2011, 07:26 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



Цитата(xvr @  1.11.2011,  23:04 Найти цитируемый пост)
Вообще то есть, но все функции работы с файлами его игнорируют. Так что #ifdef не нужны

0_BINARY в Линуксе нет. Но писать #ifdef не обязательно. достаточно один раз в своём заголовке написать
Код

#ifndef O_BINARY
#define O_BINARY 0
#endif

"b" в fopen() действительно игнорируется
аналогично с std::ios::binary


Это сообщение отредактировал(а) math64 - 2.11.2011, 15:06
PM   Вверх
xvr
Дата 2.11.2011, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(math64 @  2.11.2011,  07:26 Найти цитируемый пост)
0_BINARY в Линуксе нет.

Да, действительно нету  smile Посыпаю голову пеплом  smile 

PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0712 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.