gpt4 book ai didi

c - 为什么使用此代码创建的文本文件具有字符集 == 二进制?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:43:30 28 4
gpt4 key购买 nike

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

Compiler version - gcc (Ubuntu 8.3.0-6ubuntu1) 8.3.0.

Operating system - Tried on both Ubuntu 18.10 and 19.04.

No messages displayed by compiler.

Command used to examine the files file --mime.

Output by the command for file Text1.txt : Text1.txt: application/octet-stream; charset=binary

Output by the command for file Text1.txt : Binary: application/octet-stream; charset=binary

Output by command od -xa FILENAME is same for both files and is :

0000000 0021<br/>
!
0000001

#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);

}

预期输出是一个字符集为 ASCII 的文件和一个字符集为二进制的文件,实际输出都是字符集为二进制的文件

最佳答案

file 命令将文件诊断为二进制而非 ASCII,因为您由于错误使用 fputc 而将非 ASCII 字符写入文件。

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

GCC warns you about this ,说“警告:传递‘fputc’的参数 1 从指针生成整数,无需强制转换 [-Wint-conversion]”。您显然忽略了警告。不要那样做。当编译器警告您某事时,请注意、诊断问题并修复它。

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

要解决此问题,请将字符串 "!" 更改为单个字符 '!',以便将单个字符传递给 fputc,使用 fputc('!',fp2);

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

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

关于c - 为什么使用此代码创建的文本文件具有字符集 == 二进制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56924648/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com