Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Отличие текстовых и бинарных файлов (модификаторы b и t)

17K
12 декабря 2006 года
Soda
8 / / 17.07.2006
Всем привет.
Просто Си
Читал вот про текстовые и бинарные файлы, но так и не смог понять, как конвертятся символы \r\n когда мы открываем файл как бинарный или как текстовый.
Вот допустим есть текстовый файл, в котром при просмотре мы можем увидеть две строки:
 
Код:
one
two

1. Тоесть на диске в Windows этот файл содержит 10 символов, а именно "one\r\ntwo\r\n", тоесть размер каждой буковки и для каждой строки еще и две пары символов \r\n. Это так?

2. Если мы читаем-записываем этот файл как бинарный и заносим все элементы этого файла в строковый массив то в нем будут эти символы \r\n ?
Нужно ли сдесь следить чтобы при записи этого же массива обратно в файл в нем не оказалось кроме r\n\ еще и \o ?
Что будет если я попытаюсь записать в этот файл строку с символом \0 ?

3. Если мы читаем-записываем этот файл как текстовый, он автоматически заменит \r\n\ на \0 или как он вообще поступит в этом случае?
Как запишется в этот файл массив char с признаком конца \0 ?
Если записать две строки с символом \0 - он их запишет вторую под первой?

Большое спасибо
398
12 декабря 2006 года
Alexandoros
630 / / 21.10.2005
В общем текстовых файлов нету. Все файлы бинарные. (Запомни :) ). Другое дело ф-ции для работы с файлами. И методы отображения на экран.

Запись.
Завершающий 0 не пишется текстовыми ф-циями.
По сути запись мало отличается от бинарной, то есть пишется все то, что ты туда всунеш.
При твоем желании сделать перевод строки, ты явно, в записываемой строке, указываеш последовательность \r\n.

А вот все приколы начинаются с чтением.
Когда ты используеш "текстовую" ф-цию для чтения из файла строки (fgets например) то, при достижении последовательности 0x0D-0x0A(для вин) ф-ция прекращает чтение, формирует строку, не включая 0x0D, 0x0A (хотя могут быть варианты, может и включить, читать описалово нуна) и дополняет ее 0(тут тоже с вариантами - но это есть в описании к конкретным ф-циям.). Следующий вызов к ф-ции чтения приведет к чтению СЛЕДУЮЩИХ ЗА 0x0D, 0x0A байтов и формирования строки из них.

Кстати 0x0D, 0x0A - не единственные "запрещенные в текстовых ф-циях" значения. Все значения до 0x20(пробел) так или иначе транслируются (т.е. не попадают в строку в обычном виде). Например 0х09 - может транслироватся в 4 пробела, или же остатся табом. Но при отображении на экран символ таб, хоть он и один - все равно растянется.


Теперь конкретнее по твоим вопросам.
1) Не факт. Возможна юникс нотация когда в файле содержится лиш \n. Но текстовая ф-ция прочитает за раз все-равно только до этого символа.

2)
>>заносим все элементы этого файла в строковый массив то в нем будут эти символы \r\n ?

Для большинства ф-ций - нет, последовательность \r\n не занесется.
На счет \0 - не помню, нужно проверить. Возможно некоторые ф-ции его и возьмут, тогда у тебя за одно чтение получится 2 строки. Но скорее всего, что не включат.

НО \0 добавится автоматом, в конец строки ПОСЛЕ ее прочтения.

3)Ну тут кажись и так должно уже быть все понятно.


Ну хз, вроде в основном все. Дальше начнутся тонскости по использованию разделителя строк. Например ф-ция fscanf читает строки не до \r\n, а до первого сивола разделителя (символ <= 0x20, хотя и \r\n будут приняты как разделитель) и т.д. Но с этим уже сам разбирайся.
17K
13 декабря 2006 года
Soda
8 / / 17.07.2006
Большое спасибо!
Это был огромный вклад на пути к просветлению меня =)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог