2016-09-26 13 views
-1

固定長のバッファを書き込んで、バッファ全体を通過するように正しくオフセットするようにしていますが、オフセットの仕方は分かりません。オフセット付き固定長バッファの書き込み

int width = 512; 
int height = 512; 
int count = 304; 
size_t size = width * height * 2 * count; // buffer size 
char * buffer = new char[size]; 

は今、私はこれが正確なサイズのバッファを送信304回(カウント= 304)と同じサイズのバッファ

for (int i = 0; i < count; i++) { 
    write(fd, buffer, size/count); 
} 

を書きたいが、それは毎回同じデータを送信します。どのようにしてバッファを通過し、最後までデータの次のチャンクを送信するのですか? &buffer[size/count * i]手段がbufferisize/count番目-sizedブロックのアドレスを取得

答えて

1

あなたは反復とサイズを制御の両方のカウントを使用したい場合でも、あなたは正しく書き込みコールが実際にあなたが尋ねたよりも少ないを送信可能性があるため、あなたのループを使用していることはできません。書き込み回数をcountのバイト数に制限する場合は、書き込まれたバイト数を追跡​​する必要があります。

char* p = buffer; 
int n; 
while (size > 0){ 
    n = write(fd, p, size/count); 
    if (n < 0) { 
     // handle error as appropriate to your needs 
    } 
    size -= n; 
    p += n; 
} 

特にwriteの戻り値を無視すると、特にファイルの場合は、ソケット記述子よりも要求された値が少なくなることがよくあります。

man 2の書き込みに示されているページの「戻り値」セクションを参照してください。

+0

エラーコードをチェックするためのUpvote。 – user4581301

-1
hFileIpAddress = CreateFile(szIpAddFilePath,GENERIC_WRITE|GENERIC_READ,NULL,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); 

for (int i = 0 i<304 ; i++) 
{ 
    dwCurrentPtr = SetFilePointer(hFileIpAddress, 0, NULL, FILE_CURRENT); // it return current offset that you can use while reading. 
    WriteFile(hFileIpAddress,szIpAddress,sizeof buffer,&dwBytesWritten,NULL); 
} 
+0

書き込みの前にオフセット "dwCurrentPtr"を得ることができます。読み込み中に特定のエントリを読みたい場合に使用できます。 –

+0

回答を一般的なものにすることをお勧めします。 OPの質問には、Win32のためにコンパイルしているとは書いていません – user4581301

0
for (int i = 0; i < count; i++) { 
    write(fd, &buffer[size/count * i], size/count); 
} 

これについてもう少し考えてみても、その点は疑問です。出力はwrite(fd, buffer, size);と同じです。テストのために、ブロック間に何らかの種類のマーカーを置き、コードが動作していることを知った後に削除します。たとえば、次のように

for (int i = 0; i < count; i++) { 
    write(fd, &buffer[size/count * i], size/count); 
    write(fd, "BLOCK", 5);// remove after testing 
} 
+0

実際にファイルを読み込み、そのデータに基づいて書き込みを行っています。私は2つのファイルのdiffを行うときにそれらは異なっているので何かがまだオフである – user1984300

+0

@ user1984300間違いなく 'write(fd、" BLOCK "、5);その余分なブロックタグは、ソースと出力ブロックをブロックごとに比較して、違いがどこにあるのかを完全に見ることができるようにしなければなりません。読書コード、あなたの現在の書記コード、そしてそこに欠けているものがあるかどうかを知るための少しの 'main'関数を使って新しい質問をしたいかもしれません。たぶん、データの整合性が損なわれているかもしれませんが、私はそれ以上の情報を伝えることはできません。 – user4581301

+0

ええ、私は書き込みブロックなしで差分を行いました。私はfopenをやっていて、ファイルを読み込み、それを書いています。しかし、私はそれを304ブロックで書く必要があります。なぜなら私はforループを使用しているからです。 – user1984300

関連する問題