0

私は .ppm ファイルに書き込んでいます。これまでのところ、0 と 1 を書き込んでテストしています。メモ帳でファイルを開くと、数字が記号として表示されます。しかし、ワードパッドまたは Microsoft Word で開くと、数字が表示されます。確かにコードに問題はなく、それはメモ帳のせいですか? Google経由で調べようとしましたが、何も見つかりません。基本的に、私がやっていることは、(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))、File->Encoding->Moreを見てください)。これらの文字を取得する理由は次のとおりです。

‰のコードポイントはU2030です。あなたは(繰り返し)1 0 0バイト単位で、Asciiでエンコードされ、16進数で表されて、

3120302030

3 文字ごとに ‰ が 2 回出力される理由がわかります。最初のものについては、メモ帳がオフになっていると思い、印刷できない文字を表示します。

私のマシンでテストしているとき\nに、最初の行に最大 512 文字の後に導入すると (2 行目が 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

数字ではなくガベージ文字を取得しているため (そして %d 形式で fprintf を使用したため)、私の推測では、プログラムはデータを 1 つのエンコーディング (おそらく UTF-8) で書き出し、メモ帳はそれを別のものとして解釈しました (おそらく ASCII のみ) )。

プログラムをビルドした開発環境を調べて、デフォルトで出力されている文字エンコーディングを確認したい場合があります。

文字エンコーディングに関する大きな論文がhttp://kunststube.net/encoding/にあります。

およびメモ帳が文字のエンコードを解釈する方法に関するStackOverflowの記事

Windows メモ帳が文字を解釈する方法

最後の投稿にいくつかの役立つリンクがあります。

ファイルに書き出す機能をテストしているだけだと言っているので、入力ファイルのコードを含めると、一部の読者を誤解させる可能性があります。

于 2014-12-11T15:53:27.263 に答える