我正在写入一个 .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]);
}
}
}
最佳答案
问题与记事本处理您的文件有关。记事本查找前 512 个字节以确定文件的编码是什么。当没有指定 BOM 时,它会尝试猜测。您的文件很可能被视为 Unicode。它在我的机器上(Unicode(UTF16 LE)),查看文件->编码->更多)。这就是您获得这些字符的原因:
‰ 的码位是 U2030。您正在(重复)编写 1 0 0
,以字节为单位,以 Ascii 编码并以十六进制表示,转换为
3120302030
你可以看到为什么每 3 个字符打印 2 次‰。对于第一个,我只是认为记事本被丢弃并显示不可打印的字符。
在我的机器上测试时,似乎如果我在第一行最多 512 个字符后引入 \n
(这很重要,因为第二行可能超过 6000 个字符)我可以在记事本中加载文件,但不能超过此时间。
关于C - 写入文件给我符号而不是数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27426689/