one
two
Отличие текстовых и бинарных файлов (модификаторы b и t)
Просто Си
Читал вот про текстовые и бинарные файлы, но так и не смог понять, как конвертятся символы \r\n когда мы открываем файл как бинарный или как текстовый.
Вот допустим есть текстовый файл, в котром при просмотре мы можем увидеть две строки:
Код:
1. Тоесть на диске в Windows этот файл содержит 10 символов, а именно "one\r\ntwo\r\n", тоесть размер каждой буковки и для каждой строки еще и две пары символов \r\n. Это так?
2. Если мы читаем-записываем этот файл как бинарный и заносим все элементы этого файла в строковый массив то в нем будут эти символы \r\n ?
Нужно ли сдесь следить чтобы при записи этого же массива обратно в файл в нем не оказалось кроме r\n\ еще и \o ?
Что будет если я попытаюсь записать в этот файл строку с символом \0 ?
3. Если мы читаем-записываем этот файл как текстовый, он автоматически заменит \r\n\ на \0 или как он вообще поступит в этом случае?
Как запишется в этот файл массив char с признаком конца \0 ?
Если записать две строки с символом \0 - он их запишет вторую под первой?
Большое спасибо
Запись.
Завершающий 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 будут приняты как разделитель) и т.д. Но с этим уже сам разбирайся.
Это был огромный вклад на пути к просветлению меня =)