在C

2015-11-21 21 views
0

read()系統調用讀字符串我需要實現一個C函數在C

ssize_t readString(int filedes, char* buf, ssize_t max); 

讀取從文件描述符「與filedes」 相關文件中的字符串,到緩衝區BUF「,並返回讀取的字節數。 '最大'變量不是必需的。

換句話說,我想用

readString(fileDescriptor, buf); 

以同樣的方式,我會用

fscanf(inputFile, "%s", buf); 

下面我指什麼我迄今所做的,但它並沒有在所有的工作很好倍。 你對我的代碼有什麼建議嗎? 你可以建議更好的實現這個功能嗎?

感謝

ssize_t readString(int filedes, char* buf){ 
    char *temp; 
    int n = sizeof(buf)/sizeof(char); int i; 
    ssize_t rbytes = 0; /* bytes read */ 
    size_t cbyte = sizeof(char); 

    /* check if file is empty */ 
    if (read(filedes, temp, cbyte) < 1) 
     return 0; 

    /* eat spaces */ 
    while ((*temp == ' ') || (*temp == '\n') || (*temp == '\t')) 
     if (read(filedes, temp, cbyte) < 1) 
      return 0; 

    /* read string */ 
    for (i=0; i<n-1; i++){ 
     buf[i] = *temp; 
     rbytes++; 

     /* check if file is over */ 
     if (read(filedes, temp, cbyte) < 1) 
      return rbytes; 
     /* check if string is over */ 
     if ((*temp == ' ') || (*temp == '\n') || (*temp == '\t')) 
      break; 
    } 

    buf[++i] = '\0'; 
    return rbytes; 
} 
+1

「有時候效果不好」不是一個很好的問題描述。 –

+0

是的,給一些您的程序無法運行的示例輸入,描述預期的行爲(您已經完成)以及實際行爲是什麼。 – kaylum

回答

1
ssize_t readString(int filedes, char* buf){ 
    char *temp; 
    int n = sizeof(buf)/sizeof(char); int i; 

我想你誤會什麼sizeof一樣。它計算出你要求它計算出大小的東西的大小。在這種情況下,這是buf,這是一個char *。所以你基本上要問一個角色指針需要多少個字節。據推測,你想要的緩衝區的大小。所以你的功能需要作爲附加參數。

+0

嗯......是的,但是這個 ---> char mess [] =「hello」; printf(「sizeof(mess)=%d \ n」,sizeof(mess)); <--- 打印出「sizeof(mess)= 6」 –

+2

@DaMike對,因爲那裏'mess'是一個數組。在你的代碼中,'buf'是一個指向一個字符的指針,恰好指向一個大緩衝區中的第一個字符,但'sizeof'不關心指針指向什麼,也不會改變指針的大小*指針*。當然,'sizeof(* buf)'也不起作用,因爲buf指向*一個字符*,所以這將返回1.你的代碼需要緩衝區的大小,而且你不能只從一個指向其第一個字符的指針。 –

+0

嗯,我跑了幾個測試,你說的'混亂'的例子是正確的。我認爲我很清楚指針是如何工作的:D。謝謝你幫我解決這個問題。我會按照你的建議關於'readString'。不幸的是,我不能很好地向你描述它不適用的情況,但你已經幫了我足夠的忙。謝謝 :) –