2016-09-26 52 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); 
} 

此发送正确大小的缓冲区,但它每次发送相同的数据。我如何让它通过缓冲区并发送下一个数据块直到结束?

回答

1

即使您要使用的计数两个迭代和控制规模,不能正确地做,使用循环,因为write调用实际上可能发出比你少问。如果您希望将写入限制为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; 
} 

而忽略写的返回值经常工作,特别是对文件的时候,经常会返回一个小于要求通过套接字描述符。

检查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); 
} 

其中&buffer[size/count * i]装置采取第i尺度的size/count块的地址在buffer

虽然考虑了这一点,但这点并不实际。输出结果与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

所以我实际上正在读取一个文件,然后根据这些数据进行写操作。当我在两个文件上做差异时,它们是不同的,所以某些东西仍然关闭 – user1984300

+0

@ user1984300在差异情况下,肯定会将'write(fd,“BLOCK”,5);'离开。额外的BLOCK标签应该使ol'标记1眼球更容易地逐块比较来源与输出块,看看差异在哪里,但完全是螺旋差异。你可能想要用阅读代码,你现在的代码和一个'main'函数来问一个新问题,看看里面是否还有其他东西丢失。也许是一个数据对齐snafu什么的,但没有办法让我告诉没有更多的信息。 – user4581301

+0

是的,我没有写区块做差异。我正在做一个fopen,阅读一个文件,然后写下来。但我需要将它写入304块,这就是为什么我使用for循环的原因 – user1984300

相关问题