- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
fwrite
到 stdout
时,它会变成未定义的结果?fwrite
和 fread
函数中的 size_t count
参数有何用途? #include<stdio.h>
struct test
{
char str[20];
int num;
float fnum;
};
int main()
{
struct test test1={"name",12,12.334};
fwrite(&test1,sizeof(test1),1,stdout);
return 0;
}
输出:
name XEA
Process returned 0 (0x0) execution time : 0.180 s
Press any key to continue.
当我对文件使用 fwrite 时
#include<stdio.h>
#include<stdlib.h>
struct test
{
char str[20];
int num;
float fnum;
};
int main()
{
struct test test1={"name",12,12.334};
FILE *fp;
fp=fopen("test.txt","w");
if(fp==NULL)
{
printf("FILE Error");
exit(1);
}
fwrite(&test1,sizeof(test1),1,fp);
return 0;
}
该文件还包含这样的内容
name XEA
size_t count
设置为5时,它也变成了未定义的结果。这个论证的目的是什么?最佳答案
按照您使用它的方式,fwrite
正在写入“二进制”输出,它是您的 struct test
的逐字节表示形式和内存中一样。这种表示方式通常不是人类可读的。
当你写的时候
struct test test1 = {"name", 12, 12.334};
你在内存中得到一个结构,它可能像这样表示(所有字节值都是十六进制):
test1: str: 6e 61 6d 65 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
num: 0c 00 00 00
fnum: 10 58 45 41
具体:0x6e
, 0x61
, 0x6d
,和0x65
是 "name"
中字母的 ASCII 代码。您的str
数组的大小为 20,因此字符串 name
以 0 结尾,然后用 15 个以上的 0 字符填充。 0x0c
是数字 12 的十六进制表示形式,我假设输入 int
在你的机器上是 32 位或 4 个字节,所以那里还有 3 个 0。 (另外,我假设您的机器是“小端”,4 字节数量中的最低有效字节如 0x0000000c
首先出现在内存中。)最后,在 IEEE-754 format 中。您的机器使用的数字 12.334 以 32 位单精度 float 表示为 0x41455810
,再次以相反的顺序存储在内存中。
因此,这 28 个字节(可能还加上一些填充,我们现在不用担心)正是写入屏幕或文件的字节。字符串“name”可能是人类可读的,但其余的字面意思都是“binary garbage”。恰好组成 float 12.334的三个字节,即0x58
, 0x45
,和0x41
,对应于 ASCII 中的大写字母 X
, E
,和A
,这就是您在输出中看到这些字符的原因。
这是将程序的输出传递到“hex dump 实用程序的结果:
0 6e 61 6d 65 00 00 00 00 00 00 00 00 00 00 00 00 name............
16 00 00 00 00 0c 00 00 00 10 58 45 41 .........XEA
您可以看到字母name
开头,以及字母 XEA
最后,以及中间的所有 0 和其他二进制字符。
如果您使用的是 Unix 或 Linux(或 Mac OS X)系统,则可以使用类似 od
的工具。或 hexdump
获得类似于我所展示的十六进制转储。
您询问 fwrite
的“count”参数。 fwrite
从字面上看,它是为写出二进制结构而设计的,就像您正在做的那样。它的函数签名是
size_t fwrite(void *ptr, size_t sz, size_t n, FILE *fp);
如您所知,ptr
是指向您正在编写的数据结构的指针,并且 fp
是您正在写入的文件指针。然后你说你想写 n
(或“计数”)元素,每个尺寸 sz
.
你打过电话
fwrite(&test1, sizeof(test1), 1, fp);
表达式sizeof(test1)
给出的大小为 test1
以字节为单位。 (正如我上面提到的,它可能是 28 左右。)当然,您正在编写一个结构体,因此传递 sizeof(test1)
和1
如sz
和n
完全合理、正确。
调用也不是不合理或不正确的
fwrite(&test1, 1, sizeof(test1), fp);
现在你告诉fwrite
写入 28 个字节,每个字节大小为 1。(当然,一个字节的大小始终为 1。)
关于fwrite
的另一件事(如 @AnttiHaapala 在评论中所述):当您将二进制数据写入文件时,您应该指定 b
打开文件时标记:
fp = fopen("test.txt", "wb");
<小时/>
最后,如果这不是您想要的,如果您想要人类可读的文本输出,那么 fwrite
这不是你想要的。你可以使用类似的东西
printf("str: %s\n", test1.str);
printf("num: %d\n", test1.num);
printf("fnum: %f\n", test1.fnum);
或者,到您的文件:
fprintf(fp, "str: %s\n", test1.str);
fprintf(fp, "num: %d\n", test1.num);
fprintf(fp, "fnum: %f\n", test1.fnum);
关于c - 了解 fwrite() 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58254839/
我遇到一些 fwrite 问题,它以我不明白的方式失败。 在这段代码中,fwrite 都失败并给出 tmp = 0。 if ((file = fopen(filenameout, "wb")) !
好吧,事情是这样的……我记得上周创建了一个程序,要求我以二进制模式打开一个文件并向其中写入数据。首先,我尝试使用fopen函数,检查结果是否正确,然后尝试写入数据。我记得第一次尝试时,fwrite 操
早上好, 我正在尝试将以下结构的内容写入文件(更具体地说是 BMP 文件),并且想知道为什么 fwrite 的二进制输出ing 整个结构和 fwrite结构体的各个项目是不同的。这就是C的工作方式吗?
我在某个地方遇到了这个。 正在写入一个文件,然后rewind(fileptr) 完成,然后写入应该写入文件开头的内容。但是写在开头,不会覆盖文件的内容吗?请指教。 最佳答案 技术上,是 是的,文件将被
fwrite 一个整数取决于字节序,但是有没有一种方法可以将一个整数 0x00000004 写入一个文件,这样无论它运行在什么机器上,它都可以始终被读取为 0x00000004。 一个想法是始终按照特
我在 php 中编写一个函数,在客户端我有一个 Canvas 图像,我使用 toDataUrl() 和一个文件名将图像保存在服务器上。这是代码: 关键是这段代码有效。对于我在其上使用的三分之二的页面
当我运行这个小代码并在控制台上输入 3 个整数时,由于 fwrite 语句,它没有按应有的方式打印出来。只有在我连续按回车键一段时间后,它才会打印出来。帮助?P.S:学习速度比 scanf 和 pri
我的网站在 /var/www/html/hs/ ,我有我的更新.php .它应该写到/var/www/html/hs/json/myFile.json ,但事实并非如此。当我尝试写入 的同一目录时更新
这个函数应该获取一个参数作为文件的指针并将所有文件放入struct anagram ,然后将其写入另一个文件。现在每个数据之间都有很大的空间。 charCompare 工作正常,因为我制作了一个测试文
这是在我的网站上上传带有“var$”内容的“file.txt”的 URL: http://www.mywebsite.com/fwrite.php?stringData=var$&myFile=fil
如果字符串包含 ~,我似乎无法将其打印到标准输出。 > A = "/.git". > io:fwrite(A). /.gitok > B = "~/.git". > io:fwrite(B). **
我发现当我尝试写入一些大数据时 fwrite 失败,如下面的代码所示。 #include #include int main(int argc, char* argv[]) { int s
我正在写这个: $fh = fopen('public/newsletter.txt', 'w'); foreach($entries as $row) { fwrite($fh,
我又来了,这次有一个 PHP 问题...我正忙于制作某种管理面板(非常基本),但是当我试图像我的 slider 或其他东西一样进行更改时,fwrite 会覆盖所有内容。这是我的 PHP 代码: 0)
根据fwrite的手册页: fread() and fwrite() return the number of items successfully read or written (i.e., no
我只是想对一组数字进行排序(虽然我发布的代码不是我要使用的方法,但我确实需要将代码中的输出写入二进制文件). 一切正常,除了“ordenar”的最后一次迭代:当我在订购后再次打印回数字时,除了最后一行
我想使用 data.table::fwrite 以文本日志的形式快速存储和检索状态。这些是通过移动应用程序更新的,该应用程序使用管道工 API 调用到 R 端点。移动应用程序每秒可能会触发许多 API
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 5 年前。 Improve th
我正在尝试使用“fwrite”并制作 snd 文件。我想做 IIR 滤波器。我制作了一个 FIR 滤波器,并使用 IIR 滤波器的代码。(当然,改变系数)但我认为“fwrite”不起作用。因为IIR滤
我正在尝试将 wchar 数组写入 C 中的文件,但是存在某种损坏和不相关的数据,例如这样的变量和路径 c.:.\.p.r.o.g.r.a.m. .f.i.l.e.s.\.m.i.c.r.o.s.o.
我是一名优秀的程序员,十分优秀!