C 中的低级 I/O

问题描述 投票:0回答:1

我正在尝试解决 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#

c io low-level
1个回答
0
投票

您的目标似乎是行缓冲的,这意味着它不会更新行,直到它收到“刷新”指令以将缓冲区中的所有内容移动到屏幕。

冲洗可以通过3种方式进行:

  • \n
    字符添加到
    printf
    格式字符串或等效字符(调用
    puts
    等)。
  • 显式调用
    fflush(stdout)
  • 程序即将结束。
© www.soinside.com 2019 - 2024. All rights reserved.