为什么我的函数表示不反向复制数据?

时间:2014-11-07 06:29:42

标签: c io fwrite

我有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

我可能做错了什么?

2 个答案:

答案 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)

下面的实现似乎有效。它还纠正了您的版本的一些小的设计缺陷:

  • 您的代码向后写出所有字节,但您应该向后编写所有,并按原始顺序使用项目本身中的字节。 (毕竟,sizecount之间的区别是什么?)以下代码适用于任何规模的项目。

  • 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;
}