【问题标题】:trouble reading an array from a file into an array then printing it to another file将文件中的数组读取到数组中然后将其打印到另一个文件时出现问题
【发布时间】:2014-03-18 16:23:19
【问题描述】:

大家好,我正在尝试使这段代码在 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;
    }
}

谢谢:)

【问题讨论】:

  • "%d" 更改为"%lf"

标签: c file printing ppm


【解决方案1】:

至少需要三个更改:

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

  • 并将fprintf 中的 "%d" 更改为"%f"

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

或者,将R 声明为int 而不是double

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

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

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

【讨论】:

  • 谢谢,我现在将该数组更改为 int 类型,我想它可以解决我将来遇到的任何问题。我使用的是visual basic,我希望能回答你的问题,因为老实说,我对编译器的了解并不多。
【解决方案2】:

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

double R[128][256];

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

【讨论】:

  • 谢谢,这似乎有效,但现在输出如下所示:
  • 非常感谢您解决了我遇到的问题。忽略上面的评论
猜你喜欢
  • 2013-07-20
  • 1970-01-01
  • 1970-01-01
  • 2021-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-07
  • 2019-06-17
相关资源
最近更新 更多