【发布时间】:2021-11-26 07:04:15
【问题描述】:
好的,所以我正在学习 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 在这种情况下如何帮助我们。或者我是否过于复杂化并且方向完全错误?
【问题讨论】:
-
不,管道帮不了你。您在循环中读/写或使用
copy_file_rangelinux 系统调用 -
你在错误的方向迷路了。这里根本不需要
pipe,也不需要文件描述符。你需要一个简单的循环。 完整的解决方案是您的工作,而不是我们的工作。如果我们做所有的工作,它就违背了练习的目的。 -
@KenWhite 好吧,我很抱歉,你被冒犯了,但循环的伪代码会是什么样子
-
'open' 更像是一个 'C++' 的东西。您是否考虑过使用 C 系列函数
fopen、fread和fwrite?打开两个文件(有一些函数可以获取“随机文件名”),一个用于读取,另一个用于写入,将源文件读入数组并将字节写入目标文件。最后,关闭这两个文件就完成了。 -
就像'一次一个字节'?好吧,那就使用
fgetc和fputc。这是非常低效的,但它应该仍然有效。