使用write来打印浮点数

时间:2010-04-25 17:18:30

标签: c floating-point

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

我错过了什么?

提前致谢。

5 个答案:

答案 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的实施。正如其他人所提到的,从浮点转换为字符串表示并不是一项简单的任务。尝试从装配中这样做将是一个非常大的挑战。