1
我正在尝试读取.bmp图像并将数据写入文本文件。代码运行良好,但问题是,它无法读取整个图像一次,所以我不得不多次调用fread()
函数。在执行此操作时,我的代码将第一次读取的数据重复存储到文本文件中。为了正确读取整个图像,我必须做些什么改变?以下是我的代码片段。用fread()读取一个.bmp图像
int size = width * height;
unsigned char* data = new unsigned char[size];
filename = "image.bmp";
fname = "image_data.txt";
FILE* f = fopen(filename, "rb");
FILE *fp = fopen(fname, "w");
while(totalBytes < size)
{
readsize = fread(data, sizeof(unsigned char), size, f);
totalBytes += readsize;
for(i = 0; i < readsize; i++)
{
fprintf(fp, "%d", data[i]);
if((i % width) == 0 && i != 0)
fprintf(fp, "\n");
}
fseek(f, readsize, SEEK_SET);
readsize = 0;
}
'还要注意sizeof(unsigned char)将始终为1' - 如果您可以假设代码没有运行,例如,许多16位DSP处理器。一个安全的假设,当然,但不是很安全,不能被提出。 – mah
好的,删除它。对这些神圣的C战争(“sizeof(char)是1”,“不要投出malloc”......)有点厌倦 - 就在昨天我使用了“sizeof(char)”,并得到了一个评论,不要这样做:http://stackoverflow.com/questions/13895073/store-an-int-in-a-char-c/13895113#13895113 – schnaader
我了解“不施放malloc”神圣的战争挫折,但底线是一个字符不保证是8位宽。尽管如此,用const代替sizeof对于代码可维护性来说并不是一个好主意;如果有的话,我会建议在这种情况下使用'sizeof(* data)',这样如果'将来数据类型发生变化,尺寸意图仍然得到满足。无论如何,我为你的答案+1了。当你的答案出现时,我正准备发布有关fseek的信息。 – mah