2015-02-07 82 views
0

我正在嘗試從文件中讀取字符並使用系統調用來計算文件中某個特定字的頻率,但我的read()調用之一的行爲令我困惑。這是我寫的代碼:`在C中讀取()`系統調用不會讀取字節

int counter, seekError,readVal; 
counter = 0; 

char c[1]; 
char *string = "word"; 

readVal = read(fd,c,1); 
while (readVal != 0){ // While not the end of the file 
    if(c[0] == string[0]) { // Match the first character 
       seekError = lseek(fd,-1,SEEK_CUR); // After we find a matching character, rewind to capture the entire word 
       char buffer[strlen(string)+1]; 
       buffer[strlen(string)] = '\0'; 
       readVal = read(fd,buffer,strlen(string)); // This read() does not put anything into the buffer 

       if(strcmp(lowerCase(buffer),string) == 0) 
         counter++; 

       lseek(fd,-(strlen(string)-1),SEEK_CUR); // go back to the next character 
     } 
     readVal = read(fd,c,1); 
} 

在所有的讀取調用我用,我能夠從我的文件沒有問題,閱讀的字符。但是,readVal = read(fd,buffer,strlen9string));行不會將任何內容放入buffer,無論我如何嘗試讀取字符。幕後有什麼事情可以解釋這種行爲嗎?我試過在不同的機器上運行這段代碼,但是在那一行我仍然沒有收到buffer

+1

read函數返回什麼?如果它爲零,則表示「文件」已關閉,如果爲負,則表示錯誤,您需要檢查錯誤「errno」。 – 2015-02-07 20:29:20

+1

另外,*你怎麼知道'read'調用不起作用?這是因爲字符串比較失敗,你可能想看看'lowerCase'而不是?可以在調試器中運行並逐行瀏覽代碼,同時觀察所有變量的值和內容,或者直接在'read'後面輸出字符串(如果'read'返回一個正數)。 – 2015-02-07 20:31:01

+0

該調用返回0,但在讀取50個字符文件的三個字符後發生。據我所知,文件沒有關閉,文件末尾也沒有文件指針。我也在'gdb'中完成了它,並且所有在緩衝區中的都是'\ 001' – rafafan2010 2015-02-07 20:32:39

回答

1

這裏的問題是seekError = lseek(fd,-1,SEEK_CUR);行中的-1被解釋爲4294967295。將其轉換爲off_t類型後,系統將該偏移量解釋爲-1而不是大數字。

所以修正路線是:seekError = lseek(fd,(off_t)-1,SEEK_CUR);

1

它不應該是必要的投-1off_t類型。它看起來像你真正的錯誤是,你沒有包括<unistd.h>,所以lseek沒有正確地聲明,當你使用它。無論是該系統的執行lseek還是存在嚴重錯誤。