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

时间:2013-06-01 14:48:17

标签: c++ c file-descriptor

您好我正在尝试模拟两个从网络发送和接收C ++文件的程序,比如客户端和服务器。首先,我必须将文件拆分为4096字节的页面,然后将其发送到另一个程序以创建文件。我通过网络发送和接收文件的方式是通过写入和读取。所以在客户端程序中我必须创建一个函数来接收包并将它们放入一个文件中。我无法想办法将包放入文件中。例如,我有一个文件有2页我必须用这2页创建另一个文件。此外,我不知道它们是否有序,所以我必须创建文件并将它们放在正确的位置。

/*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,没有任何反应!你能帮助我吗?提前谢谢!

4 个答案:

答案 0 :(得分:1)

write()的第一个参数是filedescriptor,您使用open()进行了操作。所以它应该是

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

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

关于如何在特定位置写作的问题。您可以预先使用write来准备文件,然后使用seek()将文件放在要写入的位置。有关搜索的描述,您可以look here

答案 1 :(得分: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上的大多数文件系统都支持稀疏文件,磁盘上的实际文件将是已经写入的块的总和。

答案 2 :(得分:0)

马里奥,首先,不要依赖'pagenumber'中的垃圾来继续循环(这是第一次在这里检查循环边界条件时发生的)。现在,如果您正在编写页码“0”然后再页面,则pagenumber将被初始化为0并且您的循环将会出现。另外,请分别检查写入和读取的写入和读取系统调用的字节数。

答案 3 :(得分:0)

尝试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);
}