write
函数不会在以下代码中打印浮点数:
#include <unistd.h>
int main(){
float f = 4.5;
write(1,&f,sizeof float);
return 0;
}
这导致:
�@
鉴于:
int main(){
char *c = "Hello world";
write (1,c,strlen(c)+1);
return 0;
}
按预期打印Hello world
。
我错过了什么?
提前致谢。
答案 0 :(得分:4)
write
输出浮点数的二进制表示中的字节。这些字节甚至不总是对应于可读字符,更不用说数字本身的文本表示。
我想你想把数字转换成人类可读的文字。这就是printf
的用途:
printf("%f", f);
答案 1 :(得分:3)
将浮点数转换为字符串远非琐碎的问题。请参阅着名的Excel 2007 bug,了解微软是如何做错的。您应该使用诸如snprintf(3)
之类的库函数将float转换为字符串,然后您可以使用write(2)
来写出字符串:
float f = 4.5f;
char buf[64];
snprintf(buf, sizeof(buf), "%g", f);
write(1, buf, strlen(buf));
答案 2 :(得分:0)
使用write
引入了对字节序的依赖。因此,当您重新读取文件时,可能必须反转字节顺序。
否则,您的代码完全没问题。您是否尝试过编写另一个程序以同样的方式回读,并比较结果?
使用write
的全部目的是避免转换为文字。
int main(){
float f;
read(0,&f,sizeof(float) );
printf( "%f", (double) f );
return 0;
}
从shell执行
write_test | read_test
答案 3 :(得分:0)
你使用过时的函数gcvt()将带有float的case转换为你的case用string:
#include <stdlib.h> #include <stdio.h> int main() { char buffer[11]; gcvt(3.1425, 3, buffer); buffer[10]=0; write(1, buffer,strlen(buffer)+1); return 0; }
但最好使用snprintf()。
答案 4 :(得分:0)
环顾ftoa
的实施。正如其他人所提到的,从浮点转换为字符串表示并不是一项简单的任务。尝试从装配中这样做将是一个非常大的挑战。