如何逐字节复制c中的文件

how to copy a file in c byte by byte

好的,所以我正在学习 C,在一本教科书中有一个练习留给 reader 导致这个练习,这本书解释了一个文件(或至少一个常规文件)只是一个数组字节数。据我了解,在 linux 中,每个块都是 512 字节,但是当您将文件读入文件描述符时,程序会自动加载整个文件,这可能正确吗? 这本书介绍了 Linux 系统调用 read, write, and lseek(一些基本的低级调用)。

现在的目标就像我说的那样,将一个文件逐字节复制到某个随机的新文件中。伪代码将是完全可以接受的。无论如何,我的理解是你需要

我的理解是构建会像这样进行:

#include <all of the req'd headers>

int main(int argc,char** argv) {
    char buff[1]; // byte by byte buffer 
    inf fd = open("filename", O_RDONLY);
    
    int fdp[2]; // for the pipe's fd's
    pipe(fdp);
    
    if( fork() == 0 ) {
        close(fdp[0]);
        
    }

    else {
        write("newfile", buff, 1);
    }

}

至少在现阶段对我来说,这确实是一个相当复杂的问题。我的想法是将文件的全部内容读入文件描述符,然后使用管道逐字节写入新文件,将前一个文件的全部内容复制到新文件中。 我也不确定 lseek 在这种情况下如何帮助我们。还是我过于复杂化了,完全走错了方向?

正如评论中所述,您根本不需要管道。遵守 'one byte at a time' 要求,您的代码可能如下所示:

FILE *in = fopen("sourceFile", "rb");
    
if (in)
{
    FILE *out = tmpfile();
    if (out)
    {
        int c;
        while ((c = fgetc(in)) != EOF)
            fputc(c, out);
        fclose(out);
    }
    fclose(in);
}

大功告成。 请记住,关闭后 tmpfile 将被删除,因此您可能希望在关闭它之前对内容做一些事情。或者打开一个更永久的文件。

好的,我想通了,解决方法其实很简单!只有大约 10 行代码,这里是:

#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <errno.h>



int main(int argc, char ** argv) { 
    
    char oneByte;
    
    int n;
    int source;
    int destination;
    
    source = open("notes.txt", O_RDONLY);
    destination = open("copiedFile.txt", O_RDWR | O_CREAT, 0644);
    
    while ((n = read(source, &oneByte, 1)) > 0) {
        write(destination, &oneByte, 1);
    }
    
    close(source);
    close(destination);
    
    return 0;
}