-1

好的,所以我正在学习 C 并且在一本教科书中有一个练习留给读者,这本书解释了一个文件(或至少是一个常规文件)只是一个字节数组。据我了解,在 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 在这种情况下如何帮助我们。或者我是否过于复杂化并且方向完全错误?

4

2 回答 2

0

正如评论中所述,您根本不需要管道。遵守“一次一个字节”的要求,您的代码可能如下所示:

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 就会被删除,所以你可能想在关闭它之前对它的内容做一些事情。或者打开一个更永久的文件。

于 2021-10-06T05:23:21.940 回答
0

好的,所以我发现解决方案实际上非常简单!这里只有大约 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;
}
于 2021-10-06T05:36:38.633 回答