使用write()读取标准输入/文件和打印行 - 不显示行数

时间:2017-02-26 17:17:05

标签: c

我可以让它镜像线。我试图用printf打印这行,因为它被缓冲而无效,只在我 Ctrl + D 时打印。

我正在尝试write(),但没有显示输出。为什么不?我必须使用系统调用。如果在行打印后这是一件简单的事情,我怎么能在数字后添加一个空格?

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>

int main(int argc, char *argv[]) {

    int n, i = 0;
    char buf[1];
    int reader=0;

    if(argc > 1){
       reader = open(argv[2],O_RDONLY);
    }

    while(n = read(reader,buf,sizeof(buf)) > 0) {
       if (buf[0] == '\n') { 
          i++; 
          write(1, &i,sizeof(i));
       }
       write(1,buf,sizeof(buf));
    }
    close(reader);
    return 1;
}

1 个答案:

答案 0 :(得分:1)

这是一个正常运行的程序版本

请注意&#39;行号的正确时间。在一行的开头,包括第一行,在最后一行之后没有额外的行号输出

请注意使用高级I / O而不是低级read()write()

请注意检查缺少的命令行参数

当命令行参数缺失时,请注意stderr的用法语句

fopen()失败时,请注意错误检查和正确的错误消息

请注意,每个缩进级别是一致的,宽度为4个空格

注意使用变量&#39; priorCh&#39;跟踪何时需要输出行号。

请注意正确引用main()参数argcargv[]

#include <stdio.h>   // printf(), fopen(), fclose(), fgetc(), putc(), perror()
#include <stdlib.h>  // exit(), EXIT_FAILURE





int main(int argc, char *argv[])
{

    int      i = 0;       // line counter
    int      ch;
    int      priorCh = '\0';

    FILE*    reader= NULL;  // init to an invalid value

    if( 1 == argc )
    {
        fprintf( stderr, "USAGE: %s <inputFileName> \n", argv[0] );
        exit( EXIT_FAILURE );
    }

    // implied else, correct number of command line parameters


    reader = fopen(argv[1], "r");
    if( NULL == reader )
    {
        perror( "fopen for input file failed" );
        exit( EXIT_FAILURE );
    }

    // implied else, open successful

    i++;
    printf( "%d ", i );

    while( (ch = fgetc( reader ) ) != EOF )
    {
        if( '\n' == priorCh )
        {
            i++;
            printf( "%d ", i );
        }
        putc( ch, stdout );
        priorCh = ch;
    } // end while

    fclose(reader);
    return 1;
} // end function: main

使用上述文件作为输入

时,输出如下
1 #include <stdio.h>   // printf(), fopen(), fclose(), fgetc(), putc(), perror()
2 #include <stdlib.h>  // exit(), EXIT_FAILURE
3 
4 
5 
6 
7 
8 int main(int argc, char *argv[])
9 {
10 
11     int      i = 0;       // line counter
12     int      ch;
13     int      priorCh = '\0';
14 
15     FILE*    reader= NULL;  // init to an invalid value
16 
17     if( 1 == argc )
18     {
19         fprintf( stderr, "USAGE: %s <inputFileName> \n", argv[0] );
20         exit( EXIT_FAILURE );
21     }
22 
23     // implied else, correct number of command line parameters
24 
25 
26     reader = fopen(argv[1], "r");
27     if( NULL == reader )
28     {
29         perror( "fopen for input file failed" );
30         exit( EXIT_FAILURE );
31     }
32 
33     // implied else, open successful
34 
35     i++;
36     printf( "%d ", i );
37 
38     while( (ch = fgetc( reader ) ) != EOF )
39     {
40         if( '\n' == priorCh )
41         {
42             i++;
43             printf( "%d ", i );
44         }
45         putc( ch, stdout );
46         priorCh = ch;
47     } // end while
48 
49     fclose(reader);
50     return 1;
51 } // end function: main