C - 从键盘读取(由Ctrl + D控​​制)

时间:2016-10-28 07:16:22

标签: c linux stdin ctrl

我正在尝试在C中模拟tail命令,但我遇到了问题。

我需要从键盘读取一些行(STDIN)(我不在乎多少行)。按下Ctrl + d时,此读取将被中断。我已经完成了这个功能,但它不起作用。

int tail(int N)
{
    int i, j, c;
    char ** lines;
    /* Char matrix dynamic declaration */
    lines=NULL; // Char matrix declaration
    lines=malloc(N*sizeof(char *));
    for (i=0; i<N; i++){ 
        lines[i]=malloc(80 * sizeof(char));
    }
    i=0;
    while (true){ // I tried this loop, but doesn't work
        /* This works. Lanes reading from the user's keyboard */
        if(i>=N){
            for(j=0; j<=N; j++){
                if (j<(N-1))
                    lines[j]=lines[j+1];
            }
            scanf(" %[^\n]", lines[N-1]);
        }else{
            scanf(" %[^\n]", lines[i]);
        }
        i++;
        /* ------------------------------------ */
        c=getchar(); // This doesn't work
        if(c==EOF)
        goto end;
    }
end:
    for (i=0; i<N; i++){
        printf("%s\n", lines[i]); // Showing those lanes
        free(lines[i]); // Free memory
    }    
    free(lines);
    lines = NULL;

    return 0;
}

我的问题是关于读取用户的键盘行并同时读取ctrl + d。当我启动该功能时,它让我写了一些行,但是当我按Ctrl + D时它没有检测到。我怎么能这样做?

修改

我尝试了一种新方法来捕获Ctrl + d,现在我的程序结束了,但是我遇到了一些问题。这是新代码:

int tail(int N)
{
    int i, j, k, c;
    char ** lines;

    lines=NULL;
    lines=malloc(N*sizeof(char *));
    for (i=0; i<N; i++){ 
        lines[i]=malloc(MAXLON * sizeof(char));
    }
    i=0;
    while (true){
        /* Read lines from keyboard. */
        if(i<N)
            scanf(" %[^\n]", lines[i]);
        else{
            for(j=0; j<N-1; j++){
                for(k=0; k<MAXLON; k++){
                    lines[j][k]=lines[j+1][k];      
                }
            }
            scanf(" %[^\n]", lines[N-1]);
        }
        /* ------------------------------------ */
        if((c=getchar())==EOF) break;
        else i++;
    }

    for (i=0; i<N; i++){
        printf("%s\n", lines[i]);
        free(lines[i]);
    }
    free(lines);
    lines= NULL;

    return 0;

}

现在,我的程序从键盘捕获N行直到我按Ctrl + d 2次,但我现在的问题是:如果我写了5行(例如尾部(3),显示最后3行):

Line 1 
Line 2 
Line 3 
Line 4 
Line 5  
AND HERE I PRESS 2 TIMES CTRL+D

该功能显示:

Line 4
Line 5
Line 5

什么错了?该功能必须显示:

Line 3
Line 4
Line 5

非常感谢你!

1 个答案:

答案 0 :(得分:0)

请参阅以下代码作为工作示例:

#include <stdio.h>

int main(int argc, char* argvp[])
{
    char buf[1024];

    while(gets(buf))
    {
        printf("Read: %s\n", buf);
    }
    if (ferror(stdin))
        puts("I/O error when reading");
    else if (feof(stdin))
        puts("End of file reached successfully");
}

请注意

  1. 输入缓冲区buf的大小不应该是硬编码的
  2. gets已弃用,您应该使用其他内容,例如fgets
  3. 行中间的gets无法识别END-OF-FILE。它必须是第一行符号。我的RHEL 7.1就是如此,但您的系统可能会有所不同
  4. stdin应替换为您的真实输入文件描述符