在c中分配存储和二进制fwrite短路

时间:2012-02-14 05:29:41

标签: c malloc sizeof fwrite calloc

我正在尝试分配一个短块,将其写入文件,     然后读回来。但是被写入的数据     文件与出来的内容不符。我已经解决了这个问题     到下面的代码。我有什么想法吗?

#define CHUNK_SIZE 1000
void xwriteStructuresToFile(FILE *file, void * structureData)
{
    assert((fwrite(structureData, sizeof(short), CHUNK_SIZE, file)) == CHUNK_SIZE);

}

void wwbuildPtxFiles(void)
{   
    FILE *file = fopen("s:\\tv\\run32\\junky.bin", WRITE_BINARY);
    int count = 10;
    short *ptx = (short *) calloc(CHUNK_SIZE * count, sizeof(short ) );

    memset(ptx, '3', sizeof(short) * CHUNK_SIZE * count);
    for (int dayIndex = 0; dayIndex < count; ++dayIndex)
        xwriteStructuresToFile(file, (void *) &ptx[ CHUNK_SIZE * sizeof(short) * dayIndex ]);

    free(ptx);
    fclose(file);

    file = fopen("s:\\tv\\run32\\junky.bin", READ_BINARY);
    int xcount = CHUNK_SIZE * count * sizeof(short );
    for (int i = 0; i < xcount; ++i)
    {
        char x;
        if ((x = getc(file)) != '3')
            assert(false);
    }
}

5 个答案:

答案 0 :(得分:2)

从数组索引中删除sizeof(short)。 C会为你做这个计算

答案 1 :(得分:1)

在致电xwriteStructuresToFile时,您使用:

&ptx[ CHUNK_SIZE * sizeof(short) * dayIndex ]

ptx是一个短指针,意味着数组计算将自动缩放到一个短的大小。

通过在上面的表达式中明确地执行此操作,您将远远超出数组的末尾。您需要用以下内容替换该行:

xwriteStructuresToFile(file, &ptx[CHUNK_SIZE * dayIndex]);

答案 2 :(得分:1)

您正在将数据写入数组的末尾!

xwriteStructuresToFile(file, (void *) &ptx[ CHUNK_SIZE * sizeof(short) * dayIndex ]);

您应该使用:

xwriteStructuresToFile(file, &ptx[CHUNK_SIZE * dayIndex]);

C编译器自动按sizeof(short)缩放。如果您有一个整数数组,则不要编写array[i * sizeof(int)]来访问数组的i th 成员;同样,在这里您不需要按sizeof(short)缩放索引。实际上,你不要这样做是至关重要的,因为你正在写两次(假设sizeof(short) == 2),就像你期望的那样。{/ p>

您也不应该在必须执行的函数调用周围使用assert()。您可以在单独的语句中使用assert(),该语句可以从程序中省略而不会影响其功能。史蒂夫马奎尔在'Writing Solid Code'中对此进行了详细讨论,这在某些地方有点过时,但至少在这一点上是合理的。

答案 3 :(得分:1)

一些事情:

你打开文件的方式,我不确定你的常量,但他们应该阅读

"wb"写一个二进制文件并"rb"来阅读。

永远不要在断言中放置语句,在发布模式下编译程序时会删除断言。相反,检查返回值并断言

e.g。


bool ok =fwrite(structureData, sizeof(short), CHUNK_SIZE, file)) == CHUNK_SIZE;
assert(ok);

虽然您不应断言,但您应该打印出正确的错误消息。 断言用于编程错误,而不是运行时错误


short *ptx = (short *) calloc(CHUNK_SIZE * count, sizeof(short ) );

以上一行包含许多问题:

  • 永远不会在C中calloc转换short *ptx = calloc...的返回值。  如果您收到警告,请#include <stdlib.h>

  • 您应该使用calloc( count, CHUNK_SIZE * sizeof( short ));形式,否则看起来有点不清楚。      (calloc将数字,大小作为参数)


   for (int dayIndex = 0; dayIndex < count; ++dayIndex)
      xwriteStructuresToFile(file, 
         (void *) &ptx[ CHUNK_SIZE * sizeof(short) * dayIndex ]);

不确定你在那里做什么,用

替换这两个语句

fwrite( ptx, CHUNK_SIZE * sizeof( short ), count, fp );


应该写整个数组。

答案 4 :(得分:0)

由于ptxshort *指针,因此在编制索引时不应乘以sizeof(short)。索引已经以short为单位,因此您需要:

xwriteStructuresToFile(file, (void *) &ptx[ CHUNK_SIZE * dayIndex ]);