2015-10-13 75 views
-5

所以我有這個項目,我需要打開一個文件並打印C中的內容,但我必須使用unix系統調用。但我不清楚爲什麼沒有打印。我嘗試運行代碼,但它似乎直接跳到關閉錯誤。我知道我需要unistd.h,我已經包含了這個。C:無法從文件打印

#define MAXBUF 4096 
int main(int argc, char* argv[]){ 
int x = 0, y, z = 1, a;   //x: Counter, Y:int for open, z:another counter, a:int for read 
char buff[MAXBUF];    //set buffer size 
int fe,fn,ft;     //fe = found E, fn = found n, ft = found T 
if((y = open(argv[2], O_RDONLY)) == -1){ 
    errHandler("Couldn't open ", argv[2]); 
    } 
      . 
      . 
      . 

if(fn == 1){         //if fn returned true 
    printf("%d ", z++); 
    } 

while((a = read(y, buff, MAXBUF)) > 0){   

    if (buff == '\n' && fe && fn)  //<-- 
     printf("$\n%4d: ", z++); 
    else if (buff == '\n' && fe) 
     printf("\n");      //Flags for various options 
    else if (buff == '\t' && ft)   
     printf("^T"); 
    else if (buff == '\n' && fn) 
     printf("\n%4d: ", z++);   //<-- 
    else 
     printf("%c", buff); 
} 
close(y); 
if (close(y) == -1) 
    printf("Unable to close file"); 
return 0; 
} 

編輯:這是聲明。 '。'正在跳過設置標誌的代碼。

+2

您關閉了文件兩次。您應該刪除第一個關閉的實例。 –

+0

什麼是「buff」? 'read'的類型簽名要求它是一個'void *',但是你將它與'char'進行比較。 – jwodder

+3

請發佈[MCVE](https://stackoverflow.com/help/mcve)。我們可以在你的代碼中看到一些可能的問題(比如由jwodder指出),但除非你在MCVE中顯示所有相關的代碼,否則我們不能給出明確的答案。例如,邏輯依賴於你沒有顯示的變量值('fe','fn','ft'等)。 – kaylum

回答

1

在你:

if (buff == '\n' && fe && fn)  //<-- 

我假設你要檢查,如果一個空行通過檢查它反對換行符讀取。但是,buff不是字符;它是所有讀取的字符都被存儲的指針。要檢查的buff的第一個字符是換行字符,請使用:

if (*buff == '\n' && fe && fn)  //<-- 

*取消引用指針,讓您的第一個字符。你的其他支票也一樣。如果這些檢查失敗,然後打印行:

else 
    printf("%s", buff); 

注意格式化字符%s,不%c,打印字符串(緩衝區),而不是單個字符。

+0

現在正在工作。謝謝。 – user3300735

+0

鑑於原始代碼,我可以看到你是如何得到* buff的,但是因爲buff被定義爲一個char數組,所以我會使用buff [0]來保持清潔。如果我們有一個額外的char * bufp = buff,我會使用* bufp(或bufp [0]) –