0

我正在写入一个 .ppm 文件,到目前为止,我只是通过向它写入 0 和 1 来测试它。当我在记事本中打开文件时,数字显示为符号。但是当我在写字板或 Microsoft Word 中打开它时,会出现数字。代码肯定没有问题,是记事本的错吗?我试图通过谷歌查找,但我找不到任何东西。本质上,我正在做的是扩展一个文件,其中包含 (1 1 1 1) 到 (1 0 0 1 0 0 1 0 0 1 0 0) 之类的值,它们是红色像素,然后在其中添加绿色和蓝色值同样的方式。

我得到‱‰‰‱‰‰‱‰‰‱‰‰,而不是100100100100。

代码是:

#include <stdio.h>

int redArray[128][256 * 3];

int main(void) {
int x;
int y;
FILE *redFile = NULL;

imagePixels = fopen("image.ppm", "w");
redFile = fopen("image.red", "r");

readRed(redFile);

for (y = 0; y < 128; y++) {
        for (x = 0; x < 256 * 3; x += 3) {
            redArray[y][x] = 1;
    }
}

for (y = 0; y < 1; y++) {
    for (x = 0; x < 256 * 3; x++) {
        fprintf(imagePixels, "%d ", redArray[y][x]);
    }
}

fclose(redFile);
fclose(imagePixels);

return 0;
}

// This function is in a different .c file. I completely forgot to add it here but I'll leave at        the '#include' business.
void readRed(FILE *colourFile) {
   for (y = 0; y < 128; y++) {
       for (x = 0; x < 256; x++) {
            fscanf(redFile, "%d", &redArray[y][x]);
       }
   }
}
4

4 回答 4

2

问题与文件的记事本处理有关。记事本查找前 512 个字节以确定文件的编码是什么。当没有指定 BOM 时,它会尝试猜测。您的文件很可能被视为 Unicode。它在我的机器上(Unicode(UTF16 LE)),查看文件->编码->更多)。这就是你得到这些字符的原因:

‰ 的代码点是 U2030。您正在(重复地)1 0 0以字节为单位写入,以 Ascii 编码并以十六进制表示,转换为

3120302030

您可以看到为什么每 3 个字符打印 2 次 ‰。对于第一个,我只是认为记事本被扔掉并显示不可打印的字符。

在我的机器上进行测试时,似乎如果我\n在第一行中引入最多 512 个字符(这很重要,因为第二行可能超过 6000 个字符)我可以在记事本中加载文件,但不能超过那个.

于 2014-12-11T16:00:59.957 回答
1

您需要在操作之前打开文件并读取数据。现在您正在打开FILE * redArray然后直接读取它,就像它是一个数组一样。这是一个文件句柄。

您必须首先将数据读入一个数组,例如:(从此处滑动)

int fileSize;
int * contents;

//Seek to the end of the file to determine the file size
fseek(redArray, 0L, SEEK_END);
fileSize = ftell(redArray);
fseek(redArray, 0L, SEEK_SET);

//Allocate enough memory (add 1 for the \0, since fread won't add it)
contents = malloc(fileSize+1);

//Read the file 
size_t size = fread(contents,1,fileSize,redArray);

//Close the file
fclose(redArray);
于 2014-12-11T15:45:48.600 回答
0

你在声明

int redArray[128][256 * 3];

并为其分配一个句柄

redArray = fopen("image.red", "r");

我想你的意思是:

redFile = fopen("image.red", "r");

于 2014-12-11T15:48:48.420 回答
0

由于您得到的是垃圾字符,而不是数字(并且您使用了 %d 格式的 fprintf),我的猜测是,您的程序以一种编码(可能是 UTF-8)写出数据,而记事本将其解释为不同的东西(可能只是 ASCII )。

您可能想要查看构建程序的开发环境,以查看它默认输出的字符编码。

在http://kunststube.net/encoding/上有一篇关于字符编码的大论文

以及一篇关于记事本如何解释字符编码的 StackOverflow 文章

windows记事本如何解释字符

在最后一篇文章中有一些有用的链接。

由于您说您只是在测试写入文件的能力,因此包含输入文件代码可能会误导一些读者。

于 2014-12-11T15:53:27.263 回答