プロが教える店舗&オフィスのセキュリティ対策術

画像入出力のプログラムを書いた(とあるサイトからパクった)のですが、出力画像のテキストデータが文字化けしてしまいます。原因究明お願いします。このプログラムでは2倍に変換していますが、そこは重要ではなく、入出力さえできればいいです。
OS:windows 文字コード:色々試したけどダメ。試してないものもあるかも。
プログラム
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
FILE *fpi, *fpo;
unsigned char idat;

/* 引数のチェック */
if (argc != 3) {
fprintf(stderr, "Usage: %s [input] [output]\n", argv[0]);
exit(1);
}

/* 入力画像のオープン */
if((fpi=fopen(argv[1], "rb")) == NULL){
fprintf(stderr, "input file open error\n");
exit(1);
}

/* 出力画像のオープン */
if((fpo=fopen(argv[2], "wb")) == NULL){
fprintf(stderr, "output file open error\n");
exit(1);
}

/* 入力画像の読込み */
while (fread(&idat, sizeof(unsigned char), 1, fpi) == 1){

/* 2倍の変換 */
if (idat * 2 > 255) {
idat = 255;
} else {
idat = idat * 2;
}

/* 変換データの書出し */
if(fwrite(&idat, sizeof(unsigned char), 1, fpo) != 1){
fprintf(stderr, "data write error\n");
exit(1);
}

}

fclose(fpi);
fclose(fpo);

return (0);
}

コンパイル方法(cygwin)
./a 入力画像.pgm 出力画像.pgm

A 回答 (3件)

「出力ファイルが文字化けする」という表現からすると、アスキーフォーマットなのでしょうか?


※正しく処理をしていれば、ヘッダ部分に情報があるので、判断できますが。

ヘッダの処理を別にしても、アスキーフォーマットだったら、fread() で読み込んで、単純に2倍すると、概ね文字化けします。
fread() は、バイナリ値としてデータを読みますから、それを、アスキーコードだと解釈して、その上で、2倍した値にする必要があります。

ヘッダの処理が不適切でされていなくて、ヘッダ部分も(バイナリとして)2倍しているので、フォーマットを壊しているのは、既に回答があるとおりです。
    • good
    • 0
この回答へのお礼

みなさん回答ありがとうございました。
みなさんのおっしゃる通り、ヘッダー処理、2倍の部分が原因ということで、解決いたしました。

お礼日時:2013/06/18 14:32

PGMについては詳しくないですが・・・ググってみました.



http://www.wdic.org/w/TECH/PGM
これ見ると・・・最初の方にヘッダーのようなデータがあるみたいですが・・・.
そのプログラムではそれを無視しているように見えます.
    • good
    • 0

>出力画像のテキストデータが文字化けしてしまいます。



テキストデータとして扱っていないんですから当然かと思われますが……。
# そもそもPGMフォーマットとしても扱っていないですよね?

http://ja.wikipedia.org/wiki/PNM_%28%E7%94%BB%E5 …

ファイルの最初にあるマジックナンバーで、まず'P'を読み込みます。
ASCIIコードで0x50なので、
> (idat * 2 > 255)
の条件により255は超えないので2倍にして0xA0で書き出します。
次の1文字が数字の'1'~'6'。PGMとのコトなので'2'か'5'でしょうか?
これも上記の条件で255は超えませんから2倍して0x64か0x6Aで書き出し。
めでたくこの時点でPGMフォーマットから外れます。
さぁ、続けて改行コードを読み込んで…やはり上記の条件から255を超えませんので別の文字に変換します。

できあがったファイルがPGMフォーマットにはなっていないので減点です。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!