-1

こんにちは、クライアントとサーバーのようなネットワークから C++ でファイルを送受信する 2 つのプログラムをシミュレートしようとしています。まず、ファイルを 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()して、書き込みたい場所にファイルを配置できます。シークの説明については、こちらを参照してください

于 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

まず、マリオは「ページ番号」のガベージに依存せずにループを続行します (これは、ここで初めてループ境界条件がチェックされたときに発生します)。ここで、ページ番号「0」を書き込んでからそれに続くページを書いている場合、ページ番号は 0 に初期化され、ループが発生します。また、write および read システム コールでそれぞれ書き込みおよび読み取りバイト数を確認してください。

于 2013-06-01T15:11:22.350 に答える