3

很抱歉打扰你,但我已经坚持了太久了。我在 fread 上收到以下警告:“警告:传递 'fread' 的参数 1 会在没有强制转换的情况下从整数生成指针”
我是 C 新手,非常喜欢它,但不要克服这个问题。
提前致谢。

    typedef unsigned char byte;

    int main( int argc, char *argv[]){
        FILE * filein;
        filein = fopen(argv[1], "r" );
        int width=10;
        int height=10;
        byte ** data;

        // Allocation
        data = (byte **) malloc(height*sizeof(byte *));
        for(int i=0;i<height;i++){
            data[i]=(byte *) malloc(width*sizeof(byte));
        }

        for(int i=0;i<height;i++){
            for(int j=0;j<width;j++){
                fread(data[i][j], sizeof(const char), 1, infile);
            }
        }

        for(int i=0;i<height;i++){
            free(data[i]);
        }
        free(data);
        fclose(filein);

        return 0;
        exit(0);
    }

这只是实际程序的一小部分。任务是读取二进制 pgm-image,将其存储在数据矩阵中,标准化值并将它们写入新的二进制 pgm-image。

4

3 回答 3

6

fread() 需要指向缓冲区的 void* 指针。您正在传递存储在 data[i][j] 中的值,而不是指向元素data[i][j] 的指针。

尝试使用

fread(&data[i][j], sizeof(const char), 1, infile);

顺便说一句,.pgm 文件格式(如果是这样的话)有一个标题,仅读取宽度*高度字符是不够的。像素值也用空格分隔,所以需要一点解析。另请记住,行尾符号也占用空间(.pgm 一行不能超过 70 个字符)

于 2012-06-29T19:57:06.817 回答
3

data[i][j] 的类型是字节。那不是指针。如果您一次读取一个字节,您真正想要的是读取 &data[i][j]。

于 2012-06-29T19:56:54.927 回答
0

要读取单个字符,您可以执行

int c; // not char, because it must be able to hold EOF
c = getc(infile);
if( c == EOF ){
   // do something about error or premature EOF
}
data[i][j] = c;

这更冗长主要是因为您的代码没有进行错误检查。

于 2012-06-29T21:03:39.810 回答