【问题标题】:Reading a .bmp image with fread()使用 fread() 读取 .bmp 图像
【发布时间】:2012-12-16 15:31:49
【问题描述】:

我正在尝试读取 .bmp 图像并将数据写入文本文件。代码运行良好,但问题是,它一次无法读取整个图像,所以我必须多次调用fread() 函数。在执行此操作时,我的代码将第一次读取的数据重复存储到文本文件中。为了正确读取整个图像,我必须做哪些更改?下面是我的代码 sn-p。

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

【问题讨论】:

    标签: c fread


    【解决方案1】:

    您的fseek 呼叫错误。在fread调用后文件位置会在读取数据的后面,所以你可以继续阅读而不用寻找。

    之前发生的事情是您读取 X 字节,对文件位置 X 执行了不必要但无害的 fseek,然后读取了 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");
            }
    }
    

    【讨论】:

    • ` 另请注意 sizeof(unsigned char) 将始终为 1`——如果您可以假设代码未在例如许多 16 位 DSP 处理器上运行。一个安全的假设,当然,但不是那么安全,不能保证被提出。
    • 好的,删除它。有点厌倦了那些神圣的 C 战争(“sizeof(char) is 1”,“don't cast malloc”...)——就在昨天,我使用了“sizeof(char)”并得到了一条不这样做的评论:stackoverflow.com/questions/13895073/store-an-int-in-a-char-c/…
    • 我了解“不要施放 malloc”圣战的挫败感,但底线是不能保证 char 为 8 位宽。即便如此,出于代码可维护性目的,用 const 替换 sizeof 也不是一个好主意。如果有的话,我建议在这种情况下使用sizeof(*data),这样如果将来datas 类型发生变化,仍然可以满足大小意图。无论如何,我 +1 了你的答案;当您的答案出现时,我正准备发布有关 fseek 的信息。
    • @schnaader 我在这里使用了这段代码pastebin.com/0y2ayrJ9,我在控制台中得到的只是 6969696969Read failed
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-24
    • 2014-12-26
    • 1970-01-01
    • 2016-09-07
    • 1970-01-01
    • 2015-03-12
    相关资源
    最近更新 更多