C中的文件处理-意外输出
我试图找出以下代码的输出:C中的文件处理-意外输出,c,file-handling,C,File Handling,我试图找出以下代码的输出: #include <stdio.h> int main() { FILE *f; int i = 20; if ((f = fopen("file.DAT", "wb")) != NULL) { fwrite(&i, 4, 1, f); fclose(f); } return 0; } #包括 int main() { 文件*f; int i=20; if((f=fopen
#include <stdio.h>
int main()
{
FILE *f;
int i = 20;
if ((f = fopen("file.DAT", "wb")) != NULL) {
fwrite(&i, 4, 1, f);
fclose(f);
}
return 0;
}
#包括
int main()
{
文件*f;
int i=20;
if((f=fopen(“file.DAT”,“wb”))!=NULL){
写入(&i,4,1,f);
fclose(f);
}
返回0;
}
在32位
系统上,将段落符号
(十进制ascii
值182
)写入二进制文件
问题:如何确定哪个ascii
值将写入二进制文件
函数
fwrite
的第一个参数是指向数组的指针,但代码中未定义数组。如何跟踪哪些字节写入二进制文件?此代码将int
i
的内部表示形式写入以二进制模式打开的文件file.DAT
&i
不是数组的地址,而是局部变量i
的地址fwrite
将在该地址写入4个字节,在32位系统上,这将构成所讨论的整数
在little-endian体系结构(如英特尔PC和Mac)上,文件应包含4个字节,其值为:
+---------------------------+
| 0x14 | 0x00 | 0x00 | 0x00 |
+---------------------------+
但在big-endian机器上,如旧版Mac,文件内容将是:
+---------------------------+
| 0x00 | 0x00 | 0x00 | 0x14 |
+---------------------------+
如果将此文件打印到终端或将其加载到编辑器中,则可能会看到一个有趣的字符表示非ASCII值0x14
,其他标记表示空字节,或者没有。此字符显示为段落符号,可能是因为编辑器执行某种字符集转换。使用二进制转储实用程序查看文件的确切内容
为了提高可移植性,代码应为
fwrite(&i,sizeof i,1,f)代码>它应该(在我知道的大多数平台上)写入一个空格和三个NUL字节。不是ASCII值为182的段落符号。&i
表示指向i
的指针,因为i
是一个整数,您可以将i
指向的地址中的4字节内存正确写入文件。DAT
@immibis:仅用于值0x20
,不适用于十进制20
:)将20
解释为字符取决于您使用的软件。的第一个参数只是指向某些数据的通用指针。数据是什么并不重要。@RadLexus Oops,是的,空格是ASCII值32而不是20。