将输入文件,二进制和ASCII文件复制到新文件

时间:2013-10-10 01:13:16

标签: c

我刚开始学习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循环的条件应该是什么。我想可能会占用文件中的字节数并使其只要剩下更多的字节就会循环遍历文件。但是,我不完全确定如何做到这一点。在正确的方向上有任何帮助吗?

3 个答案:

答案 0 :(得分:2)

您需要捕获read的返回值:

r = read (infile, buffer, 50);

考虑如何设置循环,您可以使用始终为真的条件:while(1)(因为当您到达文件末尾时已经中断)

答案 1 :(得分: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");  
}

答案 2 :(得分:0)

首先,您可以将(r == 0)更改为(r <50),因为最后一行可能不会是完整的50个字节。如果是,则下一次运行将为0,仍将评估为true。而且你永远不会实际捕获r作为read()的返回值。

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

while(1){

    r = read(infile, buffer, 50);

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

工作得很好。当r

对于更清晰和可读的代码,可以使用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);
}