Команда file
диагностирует файлы как двоичные, а не как ASCII, поскольку вы записываете в файлы не-ASCII символы из-за неправильного использования fputc
.
fputc("!",fp2);
неверно. Первый аргумент fputc
должен быть int
со значением символа. "!"
- строковый литерал, представляющий собой массив, который автоматически преобразуется в указатель на его первый символ.
GCC предупреждает вас об этом , говоря «предупреждение: передача аргумента 1 в« fputc »делает целое число из указателя без приведения [-Wint-преобразование]». Вы, очевидно, проигнорировали предупреждение. Не делай этого. Когда компилятор предупреждает вас о чем-то, обратите внимание, диагностируйте проблему и исправьте ее.
В результате указатель преобразуется в int
, а этот int
передается в fputc
. Это может привести к записи в файл некоторого не-ASCII символа, что, в свою очередь, заставляет команду file
диагностировать файл как двоичный.
Чтобы исправить это, измените строку "!"
на один символ '!'
, чтобы вы передали один символ fputc
с fputc('!',fp2);
.
Кроме того, main
не должно быть объявлено с void main()
. Объявите его с помощью int main(void)
или int main(int argc, char *argv[])
или другим способом, определяемым реализацией.
В системах Unix полученные файлы с исправленным кодом будут идентичны. Core Unix не различает текстовые и двоичные файлы, за исключением того, что некоторые приложения могут использовать метаданные (такие как «расширенные атрибуты») для характеристики файлов различными способами. Файлы, полученные из-за неправильного кода, могут быть или не быть идентичными, поскольку идентичные строковые литералы в разных местах могут иметь или не иметь один и тот же адрес, поэтому результирующий указатель может иметь или не иметь одно и то же значение.