Консультация № 144425
19.09.2008, 20:49
0.00 руб.
0 6 3
В одной книге по Си прочитал, что использование "wt" при открытии файлов может привести к непереносимости программ.
Там написано, что нужно использовать "w" вместо этого.
-----------
Так ли это?

Обсуждение

Неизвестный
19.09.2008, 21:03
общий
это ответ
Здравствуйте, Warobushek!

Не «вместо».. первый параметр, в данном случае это w — указывает что сделать с файлом, спецификатор же t определяет как открыть файл, в данном случае — в текстовом режиме.
Обычно, не задают t т.к. Предполагается что по умолчанию открывается в текстовом режиме (что определяется переменной _fmode и режимом, устанавливаемым по умолчанию). Но наедятся на это не следует. Хотя, всё же явно задают только бинарный режим — b .
Я бы советовал использовать и t и b указывая явно. Хуже от этого не станет. А на переносимость программ это не влияет.

URL >> Описание функций C (Си) / C++ - fopen
давно
Академик
20764
1861
19.09.2008, 22:15
общий
это ответ
Здравствуйте, Warobushek!

Конечно, приведёт. Это опять чья-то самодеятельность. В стандарте "t" нет вообще. Цитирую §7.19.5.3 ISO/IEC 9899:TC2:


Приложение:
3 The argument mode points to a string. If the string is one of the following, the file is
open in the indicated mode. Otherwise, the behavior is undefined.231)
r open text file for reading
w truncate to zero length or create text file for writing
a append; open or create text file for writing at end-of-file
rb open binary file for reading
wb truncate to zero length or create binary file for writing
ab append; open or create binary file for writing at end-of-file
r+ open text file for update (reading and writing)
w+ truncate to zero length or create text file for update
a+ append; open or create text file for update, writing at end-of-file
r+b or rb+ open binary file for update (reading and writing)
w+b or wb+ truncate to zero length or create binary file for update
a+b or ab+ append; open or create binary file for update, writing at end-of-file
231) If the string begins with one of the above sequences, the implementation might choose to ignore the
remaining characters, or it might use them to select different kinds of a file (some of which might not
conform to the properties in 7.19.2).

Неизвестный
20.09.2008, 07:18
общий
это ответ
Здравствуйте, Warobushek!
Да это так. Дело в том, что для перевода строки в разных ОС используются разные символды/сочетания символов: LF (0x0A) — в системах UNIX, CR (0x0D) — в системах MacOS, CR LF (0x0D 0x0A) — в системах DOS–Windows. Поэтому файл и не рекомендуется открывать в текстовом режиме.
Неизвестный
20.09.2008, 12:33
общий
to Виктор Пырлик && Хватов Сергей
Я в растерянности.. На что ориентироваться? Влияет или нет? Ответ Хватова Сергея более убедителен, т.к. ссылка на стандарт

to Provisor и все кто знает
А разве открытие файла в текстовом режиме не подразумевает замену сочетания символов перевода строки на единственный символ LF ('\n')
средствами стандартной библиотеки?
давно
Академик
20764
1861
20.09.2008, 13:27
общий
В стандарте только сказано про текстовые и двоичные файлы. Он не оговаривает, чем отличается работа с текстовыми и двоичными файлами, но устанавливает, что по умолчанию (без "b") файл открывается в текстовом режиме. А в чём это выражается (преобразование CRLF в NL, игнорирование '\0' или даже перекодировка) - это уже реализация вольна решать сама. Например, в UNIX-ах вообще не делается никаких преобразований.
Неизвестный
20.09.2008, 13:28
общий
Вы открываете без t - по умолчанию в текстовом режиме. И в какой ОС вы это откроете - не имеет значения.
Если вы открываете файл в Linux, который был создан и заполнен в Windows (например), то конечно управляющая последовательность будет другой.
Читая файл - вы не изменяете его. Если будите писать в него, то будет это делаться либо так, как принято в вашей ОС, либо так, как вы определили сами.
С другой стороны, открыв файл в бинарном режиме (допустим, у вас "по умолчанию" такой режим работает), вы конечно можете с ним работать - но всегда ли это то, что вам надо? Все равно, запись тех же строк будет выполнена по правилам данной ОС.. или, вы должны будите специально заботиться о том, что бы управляющая последовательность была такой, как вам надо. Режим работы определяется в первую очередь конкретной ситуацией.
К тому же, имеет значение и локаль, которая у вас стоит (для *nix).
Форма ответа