gpt4 book ai didi

c - 读取 pgm 文件

转载 作者:行者123 更新时间:2023-11-30 17:02:55 26 4
gpt4 key购买 nike

您好,我有一个关于读取 pgm 值的底部值的问题。我制作了一个 2d 动态数组,并为高度和宽度添加了 2 个额外的空格,以便能够创建缓冲区,但是当我尝试读取时将第一个整数设置为 width+1 它不起作用。有任何线索说明代码为何在此停止吗?

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

最佳答案

您似乎将动态指针数组(即 board 的指示物)与二维数组混淆了。这些根本不是同一回事。请特别注意,您为 board 分配内存。像这样:

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

分配的内存足以容纳 rows + 2指向int的指针。 (请注意, Actor 阵容是不必要的,并且被许多人认为是糟糕的风格。)那么这样做有什么意义......

board=memset(board,0,((columns+2)*(rows+2)));

?除了将结果分配给 board 的事实之外没用,是什么让你认为空间有rows + 2大小?指向int的指针必然至少 ((columns+2)*(rows+2))字节? 除非columns非常小,您将超出 *board 的范围,从而产生未定义的行为。

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

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

int board[rows + 2][columns + 2];

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

那么您甚至不需要事后解除分配,尽管出于同样的原因,该数组不会在函数执行结束后继续存在。

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

int (*board)[columns + 2];

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

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

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

关于c - 读取 pgm 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36358525/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com