首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >读取pgm文件

读取pgm文件
EN

Stack Overflow用户
提问于 2016-04-01 22:10:00
回答 1查看 484关注 0票数 0

你好,我有一个关于读入一个pgm值的最低值的问题。我已经做了一个2d动态数组,并为高度和宽度添加了2个额外的空格,以便能够创建一个缓冲区,但是当我试图读取第一个整数到width+1时,它没有work.Any线索为什么代码停在这里?

代码语言:javascript
复制
FILE *pfile; //pointer to file
pfile=fopen(input_pgm,"r");
int columns,rows,value,line_of_numbers;
char pformat[50];
    if (pfile==NULL){
        printf("File is empty lame-o\n");
                    }
    else{                                 //Read from file
        fscanf(pfile,"%s",pformat);     //Things like P2,P5
        fscanf(pfile,"%d",&columns);     //Number of columns ,M, Need & or it will store it into address
        fscanf(pfile,"%d",&rows);        //Number of rows , N
        fscanf(pfile,"%d",&value);       //Number of value, W
        //Allocating 2D array to store M numbers
        //printf("Test");
        int **board;
        board = (int **)malloc((rows + 2) * sizeof(int *));
        for (i=0;i<rows+2;i++){
            board[i]=(int*)malloc((columns+2)*sizeof(int));
             }
        //printf("Test2");
        //INITILIZING TO 0
        board=memset(board,0,((columns+2)*(rows+2)));
        //printf("Test");
        //reading in numbers on to board from 1->/rows/columns+1
        for(i=1;i<=rows+1;i++){
            for(j=1;j<=columns+1;j++){
                //printf("Test3");   /*does not work after this*/
                int scanned_num;
                fscanf(pfile,"%d",&scanned_num);
                board[i][j]=scanned_num;}
        }
EN

回答 1

Stack Overflow用户

发布于 2016-04-01 23:09:18

您似乎混淆了动态指针数组(即board的referent )和2D数组。这些根本不是一回事。特别要注意的是,为board分配内存的方法如下:

板= (int **)malloc((rows + 2) * sizeof(int *));

这将分配足够的内存来容纳指向introws + 2指针。(请注意,演员阵容是不必要的,并且被许多人认为是糟糕的风格。)那么这样做有什么意义呢……

板卡(

,0,((columns+2)*(rows+2);

?除了将结果赋值给columns是无用的这一事实之外,是什么让您认为指向introws + 2指针大小的空间必须至少是((columns+2)*(rows+2))个字节?除非非常小,否则您将超出 and的界限,从而产生未定义的行为。**

此外,您还会覆盖您刚刚在读*board**,中记录的所有行指针,将它们丢弃,从而泄漏您为行内容分配的所有内存。**如果此时您的程序没有崩溃,而是继续根据C语义对其余代码执行,那么当您尝试在循环(board[i][j]=scanned_num)中取消对这些指针的引用时,您将调用更多未定义的行为。还要注意,即使board是一个二维数组,您设置的字节数也是不正确的,因为每个int都大于一个字节。

将栅格作为一个大块进行分配是有意义的,也更容易,如果您使用的至少是C99,那么最简单的方法就是通过可变长度数组:

代码语言:javascript
复制
int board[rows + 2][columns + 2];

memset(board, 0, sizeof(board));

然后,您甚至不需要在之后释放,尽管出于同样的原因,数组在函数的执行结束后不会存活。

如果您需要可以从函数返回的内容,那么您可以这样做:

代码语言:javascript
复制
int (*board)[columns + 2];

board = calloc(rows + 2, sizeof(*board));

在这种情况下,calloc()会自动将分配的空间初始化为全零,因此您不需要自己执行此操作。

无论哪种方式,它都会获得所需的空间并用零填充;不需要做任何其他事情来准备它来接收数据。还要注意,就像在第二种情况下只使用一个calloc()调用一样,当您使用完动态分配的空间时,应该只使用一个对应的free()调用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36358525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档