C - 写入文件给我符号而不是数字

标签 c file ppm

我正在写入一个 .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/

相关文章:

c - 在用 fopen 打开的文件上执行 ftruncate

c++ - 关闭程序后如何从二进制文件中读取字符串

json - 如何访问纯dart包中的 Assets 文件?

c - PPM 中显示的矩形中的 4 个三角形

c - 在 C 中,在声明中使用 ":"运算符而不是条件运算符

c - C 中窗口中未出现的交互式输入

java - 不保存数组中的单词

java - 打印 PPM 文件 - 空格错误

android - Android 中的 PPM 图像

在 foreach 循环中导出函数时,C 符号名称不在加载表中