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

时间:2014-12-11 15:40:25

标签: c file symbols writing

我正在写一个.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 个答案:

答案 0 :(得分:2)

问题与文件的记事本处理有关。记事本查找前512个字节以确定文件的编码是什么。如果未指定BOM,则会尝试猜测。您的文件很可能被视为Unicode。它在我的机器上(Unicode(UTF16 LE)),查看File-&gt; Encoding-&gt; More)。这就是你获得这些角色的原因:

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

3120302030

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

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

答案 1 :(得分:1)

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

您必须首先将数据读入数组,如: (从here刷过)

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);

答案 2 :(得分:0)

你宣布

int redArray[128][256 * 3];

并为其指定句柄

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

我认为你的意思是:

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

答案 3 :(得分:0)

因为你得到垃圾字符,而不是数字(并且你使用了带有%d格式的fprintf)我的猜测是,你的程序用一种编码(可能是UTF-8)写出数据,而Notepad把它解释为不同的东西(可能只是ASCII)。

您可能想要在构建程序的开发环境中查看默认情况下输出的字符编码。

http://kunststube.net/encoding/

上有关于字符编码的大论文

以及关于Notepad如何解释

字符编码的StackOverflow文章

How windows notepad interpret characters

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

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