2

整个晚上我一直在寻找这个问题的答案并且没有睡觉,但是,我无法让它工作......我有一个二进制文件,我想读取它并获取每个整数的值......在这里是一些代码:

FILE *f;
char ch;
char t1[3];
int l, c, grayScale, i, j;
int p =0;


f = fopen(pgm, "rb");

(...)

c = 0;
l = 0;


fscanf(f, "%d", &c);

fscanf(f, "%d", &l);

fscanf(f, "%d", &grayScale);


A = alocar_memoria_matriz(l,c);

for(i = 0; i<l; i++){
    for(j=0; j<c; j++){
        if(fread(&p,sizeof(int),1,f) !=1){
             fprintf(stderr, "\nError!\n");
             fclose(f);
             free_memoria_matriz(A,l);
             return NULL;
        }else if(p>grayScale|| p<0){
            fprintf(stderr, "\nError!\n");
            fclose(f);
            free_memoria_matriz(A,l);
            return NULL;
        }else{
        A[i][j] = (tdf_elemento) p;

    }
}
}

我做了一些printfp (使用 %d 和 %i),我得到了 -1161602550、1213357911、994462027 之类的值......我真的不知道发生了什么,我也尝试将 p 更改为 char[5] 但是到目前为止还没有工作......提前谢谢你......

4

1 回答 1

2

“二进制”打开模式不会改变fscanf解析文件的方式。它的唯一作用是(也许)防止在 stdio 设施读取文件时将\r\n行尾转换为。\n

要将 stdio 文件读f入整数i,您可以这样做fread( & i, sizeof i, 1, f )。但请注意,这不尊重字节顺序。如果没有明确的字节交换,您的二进制格式将取决于平台的字节序。

于 2013-11-09T05:15:24.287 回答