2012-12-16 50 views
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; 
} 

回答

2

您的fseek呼叫是错误的。调用fread之后的文件位置将会在后面读取数据,因此您可以直接阅读而不需要查找。

之前发生了什么事是你读X字节,做了必要,但是无害fseek到文件位置X,然后读出用Y字节,但确实有害fseek回文件位置X,让你不停地再次读取相同数据。

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"); 
     } 
} 
+0

'还要注意sizeof(unsigned char)将始终为1' - 如果您可以假设代码没有运行,例如,许多16位DSP处理器。一个安全的假设,当然,但不是很安全,不能被提出。 – mah

+1

好的,删除它。对这些神圣的C战争(“sizeof(char)是1”,“不要投出malloc”......)有点厌倦 - 就在昨天我使用了“sizeof(char)”,并得到了一个评论,不要这样做:http://stackoverflow.com/questions/13895073/store-an-int-in-a-char-c/13895113#13895113 – schnaader

+1

我了解“不施放malloc”神圣的战争挫折,但底线是一个字符不保证是8位宽。尽管如此,用const代替sizeof对于代码可维护性来说并不是一个好主意;如果有的话,我会建议在这种情况下使用'sizeof(* data)',这样如果'将来数据类型发生变化,尺寸意图仍然得到满足。无论如何,我为你的答案+1了。当你的答案出现时,我正准备发布有关fseek的信息。 – mah