如何使用C语言读写BUFSIZ



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

另一种方法将使用char buf[BUFSIZ];,其中BUFSIZ来自<stdio.h>。我们应该用BUFSIZread()write(),这会让事情变得更快。

我们测试每个方法的输入文件只是一个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);

然而,对于方法二,在我使用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);
this code:
// 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);
leaves much to be desired, 
does not handle a short remaining char count at the end of the file, 
does not handle errors, etc.
a much better code block would be:
// assume we have a valid, opened fd_in and fd_out file
char buf[BUFSIZ];
int readCount;  // number of bytes read
int writeCount; // number of bytes written
while(1)
{
    if( 0 > (readCount = read(fd_in, buf, BUFSIZ) ) )
    { // then, read failed
         perror( "read failed" );
         exit( EXIT_FAILURE );
    }
    // implied else, read successful
    if( 0 == readCount )
    {  // then assume end of file
        break; // exit while loop
    }
    // implied else, readCount > 0
    if( readCount != (writeCount = write( fd_out, buf, readCount ) ) )
    { // then, error occurred
        perror( "write failed" );
        exit( EXIT_FAILURE );
    }
    // implied else, write successful
} // end while

注意:我没有包括关闭输入/输出文件语句然而,在每次调用exit()之前,确实需要添加

相关内容

  • 没有找到相关文章

最新更新