2013-12-19 84 views
4

我想寫一個客戶端可以用來瀏覽服務器的目錄的TCP服務器。除此之外,如果這是一個普通文件,我想發送目錄的大小。文件的大小保存在「stat」結構下的size_t變量中。 我在這裏做這個:轉換size_t到字符串

char *fullName /* The path to the file *. 
/** 
    * Some code here 
    */ 
struct stat buffer; 
lstat(fullName, &buffer) 

所以現在buffer.st_size包含文件的大小。現在我想寫它()到監聽套接字,但顯然我必須以某種方式將其轉換爲字符串。我知道這可以用按位右移(>>)操作符以某種方式完成,但對我來說似乎太痛苦了。你能幫我一下嗎(即使沒有其他那些按位運算符)?

通過這不是學校或不便的方式......

PS:我在Linux上運行此。

回答

6

您可以使用函數的成員sprintf()-family將「something」轉換爲「string」。

#define _POSIX_C_SOURCE 200112L 

#include <stdio.h> 
#include <unistd.h> 
#include <string.h> 

int main(void) 
{ 
    size_t s = 123456789; 
    char str[256] = ""; 

    snprintf(str, sizeof(str), "%zu", s); 

    fprintf(stdout, "The size is '"); 
    fflush(stdout); 

    write(fileno(stdout), str, strlen(str)); 

    fprintf(stdout, "'.\n"); 

    return 0; 
} 

打印出:

The size is '123456789'. 
+0

有人誰沒有自己的頭頂......你知道你的東西! ;-) –

+0

我對使用sprintf()和snprintf()的內存有不好的經驗,但這不完全是我想要的,這是我的錯,我沒有解釋得很好。我其實想把這個尺寸轉換成它的縮放比例。例如123456789將被寫爲「117,73 MB」。現在我知道我可以使用這樣一個事實,即數字0-9對於整數和字符串具有相同的ascii代碼,但我不知道如何實際執行它。我嘗試了幾件事,但每次都失敗。 感謝您的輸入。 – revIah

+0

@ user3119598:「*我對使用sprintf()和snprintf()... *的內存有不好的使用經驗......」這只是一個培訓問題。這些功能保存並直接使用。它們比使用它們的危險性小得多,例如'scanf *()'-clan的對應物。訓練使用'sprintf()'函數,因爲它們是必不可少的。 – alk

1

char *不一定是一個字符串,可以給你想要的東西。 只管理其他計算機使用相同的協議。

,所以你可以這樣做:

write(socket, &(buffer.st_size), sizeof(size_t)); 

這也許是快,你可能要考慮的存儲方式等

+0

它必須是一個字符串,因爲它將成爲HTML頁面的一部分。 – revIah

+0

好的,「但顯然我不得不將它轉換爲字符串」已經誤導了我;) –

3

你知道size_t是無符號,但長度未知。在C99,我們有z改性劑,在作出完整的符%zu

size_t s = 123456789; 
char str[256]; 

snprintf(str, sizeof str, "%zu", s);