0

我刚刚开始学习 C 语言,我需要一个特定程序的帮助。我需要从文件中读取行(一次大约 50 个字节)并将它们复制到一个新文件中,包括二进制文件。这很简单,但我不知道我应该如何去做。到目前为止我有

 while ( ) {
    read (infile, buffer, 50);
    if (r< 0) {
            perror("cannot read infile");
            exit (-1);
    }
    if (r==0) {
            break;
    }
    write (outfile, buffer, r);
    }

虽然我已经打开和关闭了我需要的文件。循环应该一次读取文件 50 个字节并将它们写入一个新文件,但我不确定 while 循环的条件应该是什么。我在想也许可以获取文件中的字节数并制作它,这样只要还有更多字节,它就会循环遍历文件。但是,我不完全确定如何做到这一点。对正确方向有任何帮助吗?

4

3 回答 3

2

您需要捕获的返回值read

r = read (infile, buffer, 50);

鉴于循环的设置方式,您可以使用始终为真条件:(while(1)因为到达文件末尾时您已经中断)

于 2013-10-10T01:19:53.487 回答
2
while (1) {
    int r = read (infile, buffer, 50);
    if (r< 0) {
            perror("cannot read infile");
            exit (-1);
    }
    if (r==0) {
            break;
    }
    if(write (outfile, buffer, r) != r)
            printf("write error\n");  
}
于 2013-10-10T01:27:34.310 回答
0

首先,您可以将 (r == 0) 更改为 (r < 50),因为最后一行可能不会是完整的 50 个字节。如果是,则无论如何下一次运行将是 0,它仍将评估为 true。而且你从来没有真正将 r 捕获为 read() 的返回值。

对于您的实际问题,您可以通过多种方式进行。目前,你可以写

while(1){

    r = read(infile, buffer, 50);

    if ( r < 50) {
    ...
    break;
    }
}

会工作得很好。当满足 r < 50 条件时,break 语句将退出循环,这意味着没有读取任何字节。

对于更清晰易读的代码,您可以使用 int 作为布尔值,如下所示:

int FileDone = 0;
while(!FileDone){        
    ...
    if ( r < 50) {
        FileDone = 1
    }
}

或者可能是这样的:

int r = 1;
while (r > 0){

    r = read(infile, buffer, 50);

    if (r < 0) {
        perror("cannot read infile");
        exit (-1);
    }

    write (outfile, buffer, r);
}
于 2013-10-10T01:32:31.143 回答