Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中的文件处理-意外输出_C_File Handling - Fatal编程技术网

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。