【问题标题】:C: unable to print from fileC:无法从文件打印
【发布时间】:2015-10-13 21:54:29
【问题描述】:

所以我有这个项目,我需要在 C 中打开一个文件并打印内容,但我必须使用 unix 系统调用。但是,我不清楚为什么没有打印。我尝试运行代码,但它似乎直接跳到关闭错误。我知道我需要 unistd.h,我已经包含了。

#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;
}

编辑:这是声明。这 '。'正在跳过只是设置标志的代码。

【问题讨论】:

  • 您关闭了文件两次。您应该删除第一个关闭实例。
  • 什么是buffread 的类型签名要求它是 void*,但您将它与 chars 进行比较。
  • 请发帖MCVE。我们可以在您的代码中看到一些可能的问题(例如 jwodder 指出的),但除非您在 MCVE 中显示所有相关代码,否则我们无法给出明确的答案。例如,逻辑依赖于您未显示的变量值(fefnft 等)。
  • @jwodder 好吧,类型签名要求它是某种指针,通常是char *
  • 标签 ('\t') 是 ^I,而不是 ^T

标签: c printf unistd.h


【解决方案1】:

在你的:

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

我假设您想通过检查换行符来检查是否读取了空行。但是,buff 不是字符;它是一个指针,指向是否存储了所有读取的字符。要检查buff 的第一个字符是否是换行符,请使用:

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

* 取消引用指针并为您提供第一个字符。你的其他支票也一样。如果这些检查失败,则打印以下行:

else
    printf("%s", buff);

注意格式化字符%s,而不是%c,以打印字符串(缓冲区)而不是单个字符。

【讨论】:

  • 给定原始代码,我可以看到您是如何获得 *buff 的,但由于 buff 被定义为 char 数组,我会使用 buff[0] 来保持整洁。如果我们有一个额外的 char *bufp = buff,我会选择 *bufp(或 bufp[0])
猜你喜欢
  • 2014-07-05
  • 2020-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-05
  • 1970-01-01
  • 2016-01-22
相关资源
最近更新 更多