如何逐字节复制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;
}
好的,所以我正在学习 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;
}