2015-04-03 90 views
1

我必須總結兩個數字,而第一個數字不等於-1,並且數字只有一個數字。 我必須使用read()和write()。系統調用SO初學者編程

#include <unistd.h> 
#include <errno.h> 

int main() 
{ int Somma; 
    int One; 
    int Two; 

    do 
    { write(1, "\nFirst Number: ", 15); 
     if(read(0, &One, sizeof(int)) == -1) 
      perror("Error First Read"); 

     if(One != -1) 
     { write(1, "Second Number: ", 15); 
      if(read(0, &Two, sizeof(int)) == -1) 
       perror("Error Second Read"); 

      Somma = One + Two; 
      Somma -= 48; 

      write(1, "Sum: ", 5); 
      if(write(1, &Somma, sizeof(int)) == -1) 
       perror("Error Write"); 
     } 

    }while(One != -1); 

    return 0; 
} 

現在,我有一些問題。首先,當One等於-1時,程序繼續進入if語句... 第二個是最後一個write(),打印出一個數字和一個奇怪的字符(用0014代碼的一個正方形...) )。 有什麼問題?

謝謝你提前

+0

是否有任何理由,你不使用像printf(3)和scanf(3)glibc函數?您正在使用'read(2)'錯誤,讀取4個字節,等於4個字符。 'read(2)'讀取二進制數據,而不是實際的字符。 – holgac 2015-04-03 15:33:25

+0

教授說我們必須在unistd.h庫中使用read()和write()... – 2015-04-03 15:35:26

+2

噢好的。除了下面的答案之外,我想說,因爲你正在使用linux,所以請稍微不要在變量名中使用第一個字母。另一件事是,在'read(2)'和'write(2)'調用中使用'STDIN_FILENO'而不是0和'STDOUT_FILENO'而不是1。它會更容易閱讀。 – holgac 2015-04-03 15:37:56

回答

0

我猜你是在Linux或某些POSIX系統。

read(2) & write(2)系統調用是讀取字節。在現代Linux系統上,終端通常使用UTF-8編碼的字符串(如果必須,您可以使用libunistring進行處理)。出於效率原因,您應該(手動)緩衝I/O,即嘗試讀取或寫入幾千字節(通常爲16 KB)的塊。

你當然應該處理字節計數(由這些系統調用返回)。不要忘了處理錯誤情況(例如,通過與perror(3)顯示它們然後exit(EXIT_FAILURE);

你的代碼是錯誤的,因爲sizeof(int)往往是4,和你的read調用可能只讀1,2或3個字節(但很多時候它會讀取4個字節)。你必須句柄緩衝,這是練習的一部分。

您可以使用sscanf(3)snprintf(3)將字符串轉換爲int轉換並向後。不要忘記錯誤情況。