-1

您好我正在尝试模拟两个从网络发送和接收 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

4 回答 4

1

的第一个参数write()是一个文件描述符,您使用open(). 所以应该是

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

不是

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

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

于 2013-06-01T15:01:33.620 回答
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 上的大多数文件系统都支持稀疏文件,因此磁盘上的实际文件将是已写入块的总和。

于 2013-06-01T15:09:29.603 回答
0

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

于 2013-06-01T15:11:22.350 回答
0

尝试

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);
}
于 2020-06-09T18:30:45.203 回答