对于赋值,我应该创建两个方法:方法1将输入文件read()
和write()
转换为空输出文件,一次一个字节(缓慢)。
另一种方法将使用char buf[BUFSIZ];
,其中BUFSIZ
来自<stdio.h>
。我们应该read()
和write()
使用BUFSIZ
这将使事情更快。
我们在上面测试每个方法的输入文件只是一个linux字典(/dict/linux.words
)。
我已经正确地实现了方法1,在这里我一次调用一个字符的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);
但是,对于方法2,在我使用
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);
不起作用。
我知道
read()
将返回读取的字节数,如果在文件末尾,则返回0。我遇到的问题是如何比较read()
和BUFSIZ
,然后循环并从它停止的地方开始read()
,直到到达文件的真正结尾。 最佳答案
因为您的文件很可能不是BUFSIZ
的确切倍数,所以您需要检查实际读取的字节数,以便正确写入最后一个块,例如。
char buf[BUFSIZ];
ssize_t n;
while((n = read(fd_in, buf, BUFSIZ)) > 0)
write(fd_out, buf, n);