Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何仅使用系统调用回放文件描述符?_C_Unix_System Calls - Fatal编程技术网

C 如何仅使用系统调用回放文件描述符?

C 如何仅使用系统调用回放文件描述符?,c,unix,system-calls,C,Unix,System Calls,我有一个示例代码,我试图为我的操作系统分配实现一个程序,该程序将输入文件的内容复制到输出文件。我只允许使用POSIX系统调用,禁止使用stdio。 我曾考虑将内容存储在缓冲区中,但在我的实现中,我必须知道文件描述符内容的大小。我在谷歌上搜索了一下,找到了 off_t fsize; fsize = lseek (input, 0, SEEK_END); 但在这种情况下,我的文件描述符(输入)被弄乱了,我无法将其倒带到开始。我使用了这些参数,但在使用lseek之后,我想不出一种方法将其回放到文件中

我有一个示例代码,我试图为我的操作系统分配实现一个程序,该程序将输入文件的内容复制到输出文件。我只允许使用POSIX系统调用,禁止使用stdio。 我曾考虑将内容存储在缓冲区中,但在我的实现中,我必须知道文件描述符内容的大小。我在谷歌上搜索了一下,找到了

off_t fsize;
fsize = lseek (input, 0, SEEK_END);
但在这种情况下,我的文件描述符(输入)被弄乱了,我无法将其倒带到开始。我使用了这些参数,但在使用lseek之后,我想不出一种方法将其回放到文件中的第一个字符。这是我唯一需要的,因为我可以逐字节循环并将输入的所有内容复制到输出

我的代码在这里,非常简短,以防你们中的任何人需要查看:


我通过反复试验找到了答案。需要做的只是阅读文档并查看read()返回值。。。这个循环解决了这个问题

while (read (input, &content, sizeof(content)) > 0){ //this will write byte by byte until end of buffer!

     write (output, &content, sizeof(content));

}

lseek(输入,0,搜索集)
?@RuslanOsmanov,该选项不起作用。由于某种原因,指针在第一个字符后出现一到两个字符。想想看,你不需要为这个作业倒带任何东西。您也不需要考虑内容大小。不清楚你在问什么。@EJP我想是的,这是一种知道输入文件有多少字节的方法,因此允许我循环复制那么多次,避免缓冲区中出现任何垃圾……这也不正确。假设你有
int计数应该是
while((count=read(input,&content,sizeof content))>0{write(output,&content,count);}
。目前,您正在传输文件末尾的垃圾邮件(至少)。@EJP,有趣的是,它没有使用我想到的方法将任何垃圾邮件复制到新文件中。不过,还是换成了你的,因为它更有意义,也更具可读性。谢谢。也许你的文件正好是缓冲区大小的倍数。