2010-04-25 76 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。正如其他人所提到的,從浮點轉換爲字符串表示不是一項簡單的任務。試圖從大會這樣做是一個相當大的挑戰。