2010-04-25 58 views
4

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

嗯,是printf不是一个选项,或者你只是在做练习?写入只是将原始二进制文件放在屏幕上,而浮点格式需要解释。 – zdav 2010-04-25 17:22:38

+0

printf不是一个选项,因为这将以mips程序集编写 – Tom 2010-04-25 17:24:36

+1

@Tom:函数的可用性不依赖于CPU体系结构。 – kennytm 2010-04-25 17:48:26

回答

0

write介绍了字节序的依赖性。因此,当您读取文件时,您可能必须反转字节顺序。

否则,您的代码非常好。您是否尝试编写另一个程序以相同的方式回读,并比较结果?

使用write的整个要点是为了避免转换为文本。

int main(){ 

    float f; 

    read(0,&f,sizeof(float)); 
    printf("%f", (double) f); 

    return 0; 
} 

从shell执行作为

write_test | read_test 
3

浮点数转换为字符串是远离琐碎的问题。请参阅着名的Excel 2007 bug,以举例说明微软是如何做错的。您应该使用的库函数,如snprintf(3)到浮动转换为字符串,然后你可以使用write(2)写出来的字符串:

float f = 4.5f; 
char buf[64]; 
snprintf(buf, sizeof(buf), "%g", f); 
write(1, buf, strlen(buf)); 
+0

谢谢,这给了我一个不错的主意。 – Tom 2010-04-25 17:50:47

+0

我最终避免了从汇编写入并将浮点值插入到extern数组中。然后从C中打印出来。 – Tom 2010-04-25 18:59:54

0

你的猫使用过时的功能gcvt()与浮动的情况下转换你的情况与字符串:

 
#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()是可取的使用。

0

四处寻找执行ftoa。正如其他人所提到的,从浮点转换为字符串表示不是一项简单的任务。试图从大会这样做是一个相当大的挑战。