我有fwrite
的函数表示,向后写字节。然而......它并没有真正地向后复制它们,这看起来很奇怪。
size_t fwrite_backward ( const void * ptr, size_t size, size_t count, FILE * stream )
{
int i, chr;
for(i = count * size; i != 0; i--)
{
if( fputc(*(unsigned char*)ptr + (count * size) - i, stream) != EOF )
chr++;
}
return chr;
}
它应该与fwrite
完全相同,但有两点不同:
ferror
我可能做错了什么?
答案 0 :(得分:1)
用于获取fputc
字节的索引是错误的。此外,您正在错误地取消引用指针。
表达式*(unsigned char*)ptr + (count * size) - i
相当于:
char c = *(unsigned char*)ptr, (c + count*size - i)
这绝对不是你想要的。
而不是
if( fputc(*(unsigned char*)ptr + (count * size) - i, stream) != EOF )
应该是
if( fputc(*((unsigned char*)ptr + i - 1), stream) != EOF )
或
if( fputc(((unsigned char*)ptr)[i - 1], stream) != EOF )
答案 1 :(得分:1)
下面的实现似乎有效。它还纠正了您的版本的一些小的设计缺陷:
您的代码向后写出所有字节,但您应该向后编写所有项,并按原始顺序使用项目本身中的字节。 (毕竟,size
和count
之间的区别是什么?)以下代码适用于任何规模的项目。
Yor代码返回写入的字节数。但是fwrite
会返回写入的项目数。
循环在写入失败时提前结束。
所以:
size_t fwrite_rev(const void *ptr, size_t size, size_t count, FILE *stream)
{
const unsigned char *p = ptr;
size_t written = 0;
while (count--) {
if (fwrite(p + size * count, size, 1, stream) < 1) break;
written++;
}
return written;
}