2015-10-13 125 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]) –