我正在尝试在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
非常感谢你!
答案 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");
}
请注意
buf
的大小不应该是硬编码的gets
已弃用,您应该使用其他内容,例如fgets
gets
无法识别END-OF-FILE。它必须是第一行符号。我的RHEL 7.1就是如此,但您的系统可能会有所不同stdin
应替换为您的真实输入文件描述符