C 从安全的文本文件创建一个 txt.ppm 文件

C create a txt.ppm file from a safed textfile

PPM1

Textfile

我尝试创建一个 C 代码,它可以创建一个 ppm,如图 1 中的文本文件(如图 3 中所示)。如果有人可以提供帮助,那就太棒了。我是一名新程序员,我尝试做 6 小时的代码。我试图扫描文本文件中的数据并将其放入数组中并尝试使用它来生成 ppm,但我的代码无法使用:/.

前进的道路是将任务拆分成更小的子任务,分别解决和测试每个子任务,只有在它们都起作用后,才将它们组合成一个程序。

因为 OP 没有 post 编辑任何代码,所以我也不会 post 任何直接有用的代码。如果真的因为尝试过也没有任何进展而导致OP被阻塞,这其实应该是有实际意义的。如果 OP 只是在找人做作业,这会让他们非常恼火。两者都为我工作。 :)

第一个子任务是读取数组中的输入。网上有几个例子,这里有相关问题。你会想把它放在一个单独的函数中,这样以后合并到完整的项目中会更容易。由于您是初学者,因此您可以选择

这样的功能
int read_numbers(double data[], int max);

让调用者声明最大数据点数,函数returns读取数据点数;如果发生错误,则为负。您用于测试该功能的 main() 应该是微不足道的,比如说

#define MAX_NUMBERS 500

int main(void)
{
    double  x[MAX_NUMBERS];
    int     i, n;

    n = read_numbers(x, MAX_NUMBERS, stdin);
    if (n <= 0) {
        fprintf(stderr, "Error reading numbers from standard input.\n");
        return EXIT_FAILURE;
    }

    printf("Read %d numbers:\n", n);
    for (i = 0; i < n; i++)
        printf("%.6f\n", x[i]);

    return EXIT_SUCCESS;
}

第二个子任务是生成PPM图像。 PPM实际上是一组密切相关的图像格式,也称为Netpbm formats. The example image is a bitmap image -- black and white only; no colors, no shades of gray --, so the PBM格式(或PPM的变体)适用于此。

我怀疑使用二维数组最容易解决此子任务,其大小适合您可以生成的最大图像(即 unsigned char bitmap[HEIGHT_MAX][WIDTH_MAX];),但请注意,您也可以只使用一部分。 (您也可以在不使用任何数组的情况下即时生成图像,但更容易出错,并且不如使用数组存储图像那样普遍适用。)

您可能需要根据最大数据值决定位图的宽度,根据数据点的数量决定位图的高度。

为了测试,只需用一些简单的图案填充数组,或者只是从左上角到右下角的对角线。

然后,考虑编写一个将矩形区域设置为给定值(0 或 1)的函数。根据图像,您还需要一个函数来绘制垂直虚线,更改(异或)每个位的状态。例如,

#define WIDTH_MAX   1024
#define HEIGHT_MAX   768

unsigned char bitmap[HEIGHT_MAX][WIDTH_MAX];
int           width = 0;
int           height = 0;

void write_pbm(FILE *out); /* Or perhaps (const char *filename)? */

void fill_rect(int x, int y, int w, int h, unsigned char v);

void vline_xor(int x, int y, int h);

到这里,你应该已经意识到保存PBM图像的write_pbm()函数应该首先编写和测试。然后,您可以使用 fill_rect() 函数不仅绘制填充的矩形,还可以将图像(您将要使用的数组部分)初始化为背景颜色(0 或 1)。您可以而且应该在单独的子步骤中完成上述所有三个功能,以便在任何时候您都可以相信您之前编写的代码是正确的并且经过测试。这样,您只需要查看自上次成功测试以来编写的代码中的错误!这听起来像是一种缓慢的进步方式,但实际上它是让代码运行的最快方式。您很快就会喜欢上测试带给您的信心,以及您一次只需要专注和担心一件事这一事实。

第三个子任务是针对各种输入找出绘制矩形和垂直虚线的方法。

(我在上面作弊了,在之前的子任务中包含了 fill_rect()vline_xor() 函数,因为我可以看出绘制示例图片需要这些。)

垂直虚线最容易在之后绘制,使用绘制垂直线的函数,保持每个其他像素不变,但异或每个其他像素。 (提示:for (y = y0; y < y0 + height; y += 2) bitmap[y][x] ^= 1;

剩下填充的矩形。它们的高度显然是恒定的,中间有一点垂直space,并且从左边缘开始;所以,唯一的事情就是计算每个矩形需要多宽。 (而且,整个位图应该有多宽,多高,如前所述;最大数据值和数据值的数量决定了这些。)

与其编写一个 C 源文件,并在每个步骤中添加,我建议您为每个子步骤编写一个单独的程序。也就是说,每次你让一个子部分工作后,你将它保存为一个单独的文件,并保留它以供参考——如果你愿意的话,可以做一个备份。如果您完全迷失了方向,或者决定另辟蹊径解决某个问题,您只需要恢复到上一个​​参考版本,而不是从头开始。

众所周知,这种工作流程可靠、高效且可扩展:无论项目有多大,上述方法都有效。当然,有一些工具可以帮助我们以简单、结构化的方式做到这一点(如果您愿意的话,对每个 commit 进行注释——完整的代码单元); git 是一个流行的、免费的,但功能非常强大。如果您对此感兴趣,只需在网络上搜索 git for beginners

如果您不厌其烦地通读了上面的文字墙,并掌握了其中描述的工作流程,那么学习如何使用 git 之类的工具来帮助您完成工作流程就不会有太大问题.您还会喜欢像 make(以及包含制作方法的 Makefiles)这样的打字工具的帮助,以及制作和维护不仅有效而且看起来专业的项目是多么容易。然而,不要试图一下子掌握所有的东西:一次一小步,并在继续之前确认你有坚实的基础。这样,当你跌倒时,你不会伤​​到自己;只是学习。

玩得开心!