C 为什么用这段代码创建的文本文件的字符集==二进制?

C 为什么用这段代码创建的文本文件的字符集==二进制?,c,linux,gcc,file-handling,C,Linux,Gcc,File Handling,在下面的代码中,我创建了两个文件,一个是文本格式,另一个是二进制格式。文件的图标显示相同的内容。但这两个文件的特征完全相同,包括大小、字符集(=二进制)和流(八位字节)。为什么没有文本文件?因为如果我显式地创建一个文本文件,字符集就是ASCII 编译器版本-gcc(ubuntu8.3.0-6ubuntu1)8.3.0 操作系统-在Ubuntu 18.10和19.04上都试用过 编译器未显示任何消息 用于检查文件的命令文件--mime 通过文件Text1.txt的命令输出: Text1.txt:应

在下面的代码中,我创建了两个文件,一个是文本格式,另一个是二进制格式。文件的图标显示相同的内容。但这两个文件的特征完全相同,包括大小、字符集(=二进制)和流(八位字节)。为什么没有文本文件?因为如果我显式地创建一个文本文件,字符集就是ASCII

编译器版本-gcc(ubuntu8.3.0-6ubuntu1)8.3.0

操作系统-在Ubuntu 18.10和19.04上都试用过

编译器未显示任何消息

用于检查文件的命令
文件--mime

通过文件
Text1.txt
的命令输出:
Text1.txt:应用程序/八位字节流;字符集=二进制

通过文件
Text1.txt
二进制:应用程序/octet流的命令输出;字符集=二进制

命令
od-xa FILENAME
的输出对于这两个文件是相同的,并且是:

00000000021
! 0000001

#包括
void main(){
文件*fp;
文件*fp2;
INTA=10111110;
fp2=fopen(“Text1.txt”,“w”);
fputc(“!”,fp2);
fp=fopen(“二进制”、“wb”);
fputc(“!”,fp);
}

预期输出是一个字符集为ASCII的文件和一个字符集为二进制的文件,实际输出是两个字符集为二进制的文件。
File
命令将文件诊断为二进制而非ASCII,因为您由于不正确使用
fputc
而将非ASCII字符写入文件

fputc(“!”,fp2)不正确。
fputc
的第一个参数应该是带有字符值的
int
“!”
是字符串文字,它是一个数组,自动转换为指向其第一个字符的指针

,表示“警告:传递'fputc'的参数1会从指针生成整数,而无需转换[-Wint conversion]”。你显然忽视了警告。不要那样做。当编译器向您发出警告时,请注意、诊断问题并修复它

结果是指针被转换为
int
,该
int
被传递到
fputc
。这可能会导致某些非ASCII字符写入文件,从而导致
file
命令将文件诊断为二进制文件

要解决此问题,请将字符串
“!”
更改为单个字符
“!”
,这样您就可以通过
fputc(“!”,fp2)将单个字符传递给
fputc

此外,
main
不应使用
void main()
声明。使用
intmain(void)
intmain(intargc,char*argv[])
或其他实现定义的方式声明它

在Unix系统上,具有更正代码的结果文件将是相同的。Core Unix不区分文本文件和二进制文件,只是有些应用程序可能使用元数据(如“扩展属性”)以各种方式描述文件。由错误代码生成的文件可能相同,也可能不相同,因为不同位置的相同字符串文字可能具有相同的地址,也可能不具有相同的地址,因此生成的指针可能具有相同的值。

C原则上区分了二进制和文本流。遍历文本流的数据可能会进行依赖于实现的转换:

在输入和删除时,可能必须添加、更改或删除字符 输出,以符合在中表示文本的不同约定 主机环境。因此,不需要一对一 流中的字符与流中的字符之间的对应关系 外部代表。从文本流读入的数据将 必须与之前写入的数据进行比较 仅当:数据仅由打印字符和 控制字符水平选项卡和新行;没有新线 字符前面紧跟空格字符;最后呢 字符是一个新行字符。是否为 读取时,在新行字符出现之前立即写入 在实现中定义了

()

然而,实际上,在任何系统上,您可能遇到的面向字节的流的唯一转换是在使用回车/换行符对作为文本文件中的行终止符的系统(主要是Windows)上的行终止符转换。C文本模式流将在该外部表示和C仅换行的内部表示之间转换

然而,在Linux和现代基于BSD的macOS上,甚至没有这样的区别——这些操作系统实际上对文本文件和二进制文件没有区别,而且生成文件的两种机制产生相同的文件也毫不奇怪


一个试图猜测文件类型的外部程序如何解释任何给定的文件,特别是非常短的文件,这是一个完全独立的问题。如果文件包含单词和句子形式的真实文本,则更有可能被检测为文本。

任何数字文件都是“二进制”文件。您在哪个操作系统上编译和运行此文件?哪个编译器?为操作系统和编译器详细信息进行编辑您为什么说它们是二进制的?因为您没有\c字符?除非在Windows下或您明确地写下,
fputc(“!”,fp2),否则不会生成该文件/
fputc(“!”,fp)可见,UV。@bruno,否:
fputc(“!”,…)
vs.
fputc(“!”,…)
@Matthieu我想说的是OP使用了
fputc(“!”,fp2)
fputc(“!”,fp)(不是对),因此这两个文件都不获取“!”正如所料。我只是想祝贺埃里克·波斯特希尔的好观点,仅此而已;-)当然,这些错误应该被纠正,但纠正后的程序不太可能
#include<stdio.h>
void main(){

FILE *fp;
FILE *fp2;
int a = 10111110;

fp2 = fopen("Text1.txt","w");
fputc('!',fp2);

fp = fopen("Binary","wb");
fputc('!',fp);

}