使用open()在文件的特定位置写入



你好,我试图模拟两个程序,从网络发送和接收C++文件,像客户端和服务器。首先,我必须将一个文件分割为4096字节的页面,并将其发送给另一个程序以创建该文件。我通过网络发送和接收文件的方式是写和读。因此,在客户机程序中,我必须创建一个函数来接收包并将它们放入文件中。我想不出把这些包放入文件的方法。例如,如果一个文件有两个页面,我必须使用这两个页面创建另一个文件。我也不知道它们是否按顺序排列,所以我必须创建文件并将它们放在正确的位置。

/*consider the connections are ok and the file's name is at char* name*/
int file=open(name,"O_CREAT | O_WRONLY,0666);
char buffer[4096];
int pagenumber;
for(int i=0;i<page_number;i++){
  read(socket,&pagenumber,sizeof(int));
  read(socket,buffer,sizeof(int));
  write(file(pagenumber*4096),buffer,4096);
}

这段代码适用于pagenumber=0,但pagenumber=1什么也没有发生!你能帮我吗?提前感谢!

要写入文件中的某个位置,必须使用lseek

 off_t lseek(int fd, off_t offset, int whence);

它接受描述符,偏移量,最后一个参数是一个常量:

SEEK_SET将偏移量设置为偏移字节。

SEEK_CUR将偏移量设置为当前位置加上偏移字节。

SEEK_END偏移量设置为文件大小加上偏移字节。

如果你知道文件有多大,你可以使用ftruncate。

int ftruncate(int fd, off_t length);

无论如何,即使您创建了一个非常大的文件,由于Linux上的大多数文件系统都支持稀疏文件,因此磁盘上的实际文件将是已写入的块的总和。

write()的第一个参数是一个文件描述符,它是通过open()获得的。所以应该是

int file = open(...);
...
write(file,buffer,4096);

write(file(pagenumber*4096),buffer,4096);

关于如何在一个特定的位置写作的问题。您可以事先用write准备文件,然后使用seek()将文件定位到您想要写入的位置。有关seek的描述,请查看此处

Mario,首先,不允许依赖'pagenumber'中的垃圾来继续循环(这是在第一次检查循环边界条件时发生的)。现在,如果你写页码'0',然后在后面写一页,页码将被初始化为0,循环就会出来。另外,请分别检查write和read系统调用中写入和读取的字节数。

try pwrite

int file=open(name,"O_CREAT | O_WRONLY,0666);
char buffer[4096];
int pagenumber;
for(int i=0;i<page_number;i++){
  read(socket,&pagenumber,sizeof(int));
  read(socket,buffer,sizeof(int));
  pwrite(file,buffer,4096,4096*i);
}

相关内容

  • 没有找到相关文章

最新更新