你好,我试图模拟两个程序,从网络发送和接收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);
}