2017-02-25 48 views
0

我需要使用read系統調用來讀取unsigned short。 根據the manpageC如何使用read系統調用讀取字節?

讀()嘗試從文件描述符fd 讀取多達count字節到開始buf緩衝區。

在我的情況下,unsigned short是兩個字節大小,所以它可以存儲數高達65535。但是,當我執行此代碼:在命令行

char buf[2]; 
bytes_read = read(0, buf, 2); 
bytes_wrote = write(1, buf, 2); 

和類型,比方說,號碼123,它只返回12。它不讀取字節,而是符號?我怎樣才能將一個超過2個符號的值讀入一個2字節的緩衝區?例如,unsigned short的最大值。我在K & R或關於它的手冊中沒有發現任何內容,所以我認爲它非常簡單。

+0

是的,它讀取字節。它不會_parse_他們,只是讀它們。你會得到前兩個字節。 –

+0

@QPaysTaxes是的,我發現它,終端有許多不同的符號。這似乎是ASCII解釋! – Tehada

+1

什麼編碼沒關係。你輸入'1',然後輸入'2',然後輸入'3';您的代碼將會讀取您寫入的前兩個字節。它不會解釋(爲了方便使用ASCII)0x31,然後是0x32作爲數字12;它會將其解釋爲0x31,然後是0x32。 –

回答

3

注:我假設您的終端使用ASCII或UTF8。爲了解釋的目的,它們是等價的。

當你輸入,比方說,123read沒有得到作爲一個數字。它看到,作爲一個字節序列 - 因爲你說它應該看起來填充緩衝區,它看到的前兩個字節:首先,0x31,然後是0x32。它讀取第一個字節,然後讀取第二個字節;它不會將它們解釋爲數字。發現字節序列發生表示解碼爲ASCII或UTF8時的數字是不相關的;所有C關心的是字節的實際順序,這就是它給你的。

請注意,它甚至沒有參見的第三個字節。這留在輸入流中以供稍後的輸入操作使用。

如果這就是你想要的,太棒了!如果您想要輸入一個數字(即輸入的數據字符串的值與十進制數字對齊),請查看fscanf及其相關函數。