如何在C中使用读取和写入过去的BUFSIZ

Ale*_*lex 2 c linux system file stdio

对于作业,我应该创建两种方法:方法一将输入文件read()转换write()为空输出文件,一次一个字节(缓慢)。

另一种方法将使用char buf[BUFSIZ];where BUFSIZis from <stdio.h>。我们应该这样做read(),并且write()这样做BUFSIZ会让事情变得更快。

我们测试每个方法的输入文件只是一个 Linux 字典 ( /dict/linux.words)。

我已经正确实现了方法一,我一次调用一个字符,将输入文件复制到输出文件read()write()虽然速度很慢,但至少把所有东西都复制过来了。

我的代码如下所示:

// assume we have a valid, opened fd_in and fd_out file.
char buf;
while(read(fd_in, buf, 1) != 0)
    write(fd_out, buf, 1);
Run Code Online (Sandbox Code Playgroud)

然而,对于方法二,当我使用 时BUFSIZ,我无法将每个条目传输到输出文件中。它在条目中失败z,并且不再写入。

所以,我的第一次尝试:

// assume we have a valid, opened fd_in and fd_out file
char buf[BUFSIZ];
while(read(fd_in, buf, BUFSIZ) != 0)
    write(fd_out, buf, BUFSIZ);
Run Code Online (Sandbox Code Playgroud)

不起作用。

据我所知,read()如果它位于文件末尾,则将返回读取的字节数或 0。我遇到的问题是理解如何与 进行比较read()BUFSIZ然后循环并read()从它停止的地方开始,直到到达文件的真正末尾。

Pau*_*l R 5

由于您的文件很可能不是您需要检查实际读取的字节数的倍数BUFSIZ,以便正确写入最后一个块,例如

char buf[BUFSIZ];
ssize_t n;
while((n = read(fd_in, buf, BUFSIZ)) > 0)
    write(fd_out, buf, n);
Run Code Online (Sandbox Code Playgroud)