我正在尝试解决 K&R C 编程书中的一个问题,该问题需要编写一个低级 I/O 程序,该程序从文件中读取文本并将其打印在屏幕上,如果命令行中没有给出输入文件,则它必须从 STDIN 获取输入并在屏幕上打印。我想我已经解决了问题,我的代码如下:
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
void llfilecopy (int, int);
int main(int argc, char *argv[])
{
int ifd, i = 1;
printf("buffer = %d", BUFSIZ);
if (argc == 1)
llfilecopy (0, 1);
else
{
while (--argc > 0)
{
if ((ifd = open(argv[i++], O_RDONLY, 0)) == EOF)
{
printf("cat: cant open %s\n", *argv);
return 1;
}
else
{
llfilecopy (ifd, 1);
printf ("\n\n");
close(ifd);
}
}
}
return 0;
}
void llfilecopy (int ifd, int ofd)
{
char buff [BUFSIZ];
int n;
while ((n = read (ifd, buff, BUFSIZ)) > 0)
{
if (write (1, buff, n) != n)
printf ("cat: write error on stdout");
}
}
但是,我面临着一个我无法解释的有趣问题。 请注意 main() 之后第 3 行的 printf 语句。如果我使用以下
printf("buffer = %d", BUFSIZ);
此 printf 在屏幕上打印文件后执行。 但是如果我添加一个 ' 我是。
printf("buffer = %d\n", BUFSIZ);
printf 在将文件打印到屏幕之前执行。 也许这只是我的一个愚蠢的错误。你能指出这里出了什么问题吗?太感谢了。 我正在使用在线 GDB C 编译器 https://www.onlinegdb.com/online_c_compiler#
您的目标似乎是行缓冲的,这意味着它不会更新行,直到它收到“刷新”指令以将缓冲区中的所有内容移动到屏幕。
冲洗可以通过3种方式进行:
\n
字符添加到 printf
格式字符串或等效字符(调用 puts
等)。fflush(stdout)
。