如何从stdin打印行?

时间:2019-01-19 22:43:31

标签: c while-loop scanf

我正在将标准输入重定向到在命令行上运行时从命令ls -l生成的输出,我想打印出其结果。

所以说在运行ls -l之后,我得到以下输出:

total 519
-rw-------  1 jeff  dev    1274 22 Jun 14:52 prinprog
-rwx---xr--  1 jeff  dev   2410  6 Apr 12:10 temp.txt
-rwxr----x  1 jeff  dev    8128  1 Feb  2013 yyz
-rw-r--r--  1 jeff  dev      98 15 Feb  2013 yyz.c

现在,在编译我的C程序之后,我执行ls -l | ./testing,我已经有效地将标准输入从键盘变成了ls -l命令产生的输出。现在,我要在C程序中执行的操作是打印出ls -l命令产生的输出。

我通过scanf()和while循环来做到这一点。我遇到的麻烦是格式化文本。第一行“ total 519”对我来说毫无用处,但是却使我失望。

#include <stdio.h>

int main() {

char permissions[10];
int num;
char user[20];
char random[20];
int fileSize;

while(scanf("%s %d %s %s %d", permissions, &num, user, random, &fileSize) != EOF) {
    printf("%s %d %s %s %d\n", permissions, num, user, random, fileSize);
}

return 0;  
} 

1 个答案:

答案 0 :(得分:1)

提案:

#include <stdio.h>

int main() {
  static char line[256];

  while (fgets(line, sizeof(line), stdin) != NULL) {
    char perms[11];
    int nlinks;
    char user[20];
    char grp[20];
    int size;
    char month[10];
    int day;
    char time[10];
    char name[256];

   if (sscanf(line, "%10s %d %19s %19s %d %9s %d %9s %255s",
               perms, &nlinks, user, grp, &size, month, &day, time, name) == 9)
       printf("perms=%s nlinks=%d user=%s grp=%s size=%d month=%s date=%d time/year=%s name=%s\n",
         perms, nlinks, user, grp, size, month, day, time, name);
  }

  return 0;  
} 

执行示例:

ls -l /usr/sbin | ./a.out
perms=-rwxr-xr-x nlinks=1 user=root grp=root size=9788 month=déc. date=13 time/year=2016 name=accessdb
perms=-rwxr-xr-x nlinks=1 user=root grp=root size=3078 month=oct. date=5 time/year=22:43 name=addgnupghome
perms=lrwxrwxrwx nlinks=1 user=root grp=root size=7 month=juin date=27 time/year=2016 name=addgroup
perms=-rwxr-xr-x nlinks=1 user=root grp=root size=860 month=avril date=2 time/year=2017 name=add-shell
perms=-rwxr-xr-x nlinks=1 user=root grp=root size=34509 month=juin date=27 time/year=2016 name=adduser
perms=-rwxr-xr-x nlinks=1 user=root grp=root size=4136 month=janv. date=23 time/year=2017 name=alsabat-test
perms=-rwxr-xr-x nlinks=1 user=root grp=root size=83912 month=janv. date=23 time/year=2017 name=alsactl
perms=-rwxr-xr-x nlinks=1 user=root grp=root size=27872 month=janv. date=23 time/year=2017 name=alsa-info
perms=-rwxr-xr-x nlinks=1 user=root grp=root size=2219 month=oct. date=5 time/year=22:43 name=applygnupgdefaults
perms=-rwxr-xr-x nlinks=1 user=root grp=root size=44224 month=déc. date=26 time/year=2016 name=arp
perms=-rwxr-xr-x nlinks=1 user=root grp=root size=42920 month=nov. date=24 time/year=2017 name=arpd
perms=-rwxr-xr-x nlinks=1 user=root grp=root size=13542 month=oct. date=10 time/year=2016 name=aspell-autobuildhash
perms=-rwxr-xr-x nlinks=1 user=root grp=root size=17884 month=déc. date=8 time/year=2016 name=atd
perms=-rwxr-xr-x nlinks=1 user=root grp=root size=105136 month=janv. date=23 time/year=2017 name=avahi-daemon
...