我正在尝试分配一个短块,将其写入文件, 然后读回来。但是被写入的数据 文件与出来的内容不符。我已经解决了这个问题 到下面的代码。我有什么想法吗?
#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);
}
}
答案 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)
由于ptx
是short *
指针,因此在编制索引时不应乘以sizeof(short)
。索引已经以short
为单位,因此您需要:
xwriteStructuresToFile(file, (void *) &ptx[ CHUNK_SIZE * dayIndex ]);