如何在C ++中读取.raw文件

时间:2019-03-21 08:43:01

标签: c++

    void solution3(){
        char str[100];
        int height, width;

        printf("가로와 세로 길이를 입력 : ");
        scanf("%d %d", &width, &height);
        FILE* fp = fopen("lena_256x256.raw", "rb");

        //2dynimic
        unsigned char **p = new unsigned char*[height];

        for(int i = 0; i < height; i++) *(p + i) = new unsigned char[width];
        for(int i = 0; i < height; i++){
            for(int j = 0; j < width; j++)
                fread((void*)p[i][j], sizeof(unsigned char), height * width, fp);
        }

        //print
        for(int i = 0; i < height; i++){
            for(int j = 0; j < width; j++)
                printf("%4d ", p[i][j]);
        }

        //del dynimic
        for(int i = 0; i < height; i ++) delete[] p[i];
        delete[] p;

        fclose(fp);
    }

void main(){
 solution3();
}

错误消息是“ string!= NULL”,为什么无法读取.raw文件? 我尝试p[i][j]修复(void*)p[i][j]。但不能。

我想阅读.raw并打印有关.raw灯的信息

1 个答案:

答案 0 :(得分:4)

代码在这里具有未定义的行为:

    unsigned char **p = new unsigned char*[height];
    ....
            fread((void*)p[i][j], sizeof(unsigned char), height * width, fp);

p是char的指针。这意味着p[i][j]是一个字符,代码将其强制转换为(void*)。这是fread试图写入的无效地址。

您可能想要:

    for(int i = 0; i < height; i++){
        if (fread((void*)p[i], 1, width, fp) != width)
        {
           manage the error condition
        }
    }

除此之外,建议不要直接使用new / delete,在这种情况下std :: vector会更安全。另外,void main()是错误的,应改为int main()