1

嘿伙计们,我正在尝试使这段代码在 c 中工作,我有一个看起来像这样的数据文件:

123 456 789 101 121 131 415....

它是图像的数据,这些数字在 256X128 的网格中,我正在尝试使用嵌套的 for 循环读取这些数字并以相同的方式打印它们,但输出文件中应该有相同的网格实际上是:

-858993460-858993460-858993460-858993460-858993460-858993460-858993460-858993460...

我不确定我的代码需要更改什么来解决这个问题,因为我是编程新手,这是我第一次尝试代码,如果不太清楚,很抱歉

#include <stdio.h>;

#define height 128
#define width 256
#define MAX 255
char magic[] = "P3";

int main()
{
    {
    int n, m;
    double R[128][256];
    FILE *red = NULL;
    red = fopen ("picture.red", "r");           //read infile//
        for (n=0; n<128; n++) 
            {
            for (m=0; m < 256; m++)
                fscanf(red, "%d", &R[n][m]);    //scan in grid//
        }
        fclose (red);
    }

    {
    int n,m;
    double R[128][256];
    FILE *pfile = NULL;
    pfile = fopen ("myfile.ppm", "w");          //create new file//
        fprintf(pfile, "%s\n%d %d\nNorman Norm\n%d\n", magic, width, height, MAX);
        for (n=0; n<128; n++)
            {                   //print header for outpute file//
            for (m=0; m<256; m++)
                fprintf (pfile, "%d", R[n][m]); //print grid into output file//
            fprintf (pfile, "\n");
        }
        fclose(pfile);                          //close output file//
return 0;
    }
}

谢谢 :)

4

2 回答 2

0

我不确定这是否是您的代码中唯一的问题,但是您R两次声明了数组,将数据读入第一个数组,然后从未初始化的第二个数组写入数据。移动声明

double R[128][256];

在 main 中的第一个块之前,并删除 . 的第二个声明R

于 2014-03-18T16:31:57.297 回答
0

至少需要三个更改:

  • 您需要将第一个 更改为,"%d"因为它是指向 a 的指针。fscanf"%lf"&R[n][m]double

  • 并将第二个 "%d" 更改fprintf"%f".

  • 并移动double R[128][256];以便两个部分使用相同的数组(并删除第二个定义)。

或者,声明Rint而不是double

编辑:您使用的是什么编译器?大多数广泛使用的编译器应该给你一个警告。例如gcc,使用标准开关给出警告:

第 1 行:警告:#include 指令末尾的额外标记
第 18 行:警告:格式“%d”需要类型“int *”,但参数 3 的类型为“双 *”
第 32 行:警告:格式“%d”需要输入“int”,但参数 3 的类型为“double”

(加上对原型的抱怨main())。

于 2014-03-18T16:32:07.493 回答