
画像入出力のプログラムを書いた(とあるサイトからパクった)のですが、出力画像のテキストデータが文字化けしてしまいます。原因究明お願いします。このプログラムでは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

No.3ベストアンサー
- 回答日時:
「出力ファイルが文字化けする」という表現からすると、アスキーフォーマットなのでしょうか?
※正しく処理をしていれば、ヘッダ部分に情報があるので、判断できますが。
ヘッダの処理を別にしても、アスキーフォーマットだったら、fread() で読み込んで、単純に2倍すると、概ね文字化けします。
fread() は、バイナリ値としてデータを読みますから、それを、アスキーコードだと解釈して、その上で、2倍した値にする必要があります。
ヘッダの処理が不適切でされていなくて、ヘッダ部分も(バイナリとして)2倍しているので、フォーマットを壊しているのは、既に回答があるとおりです。
No.2
- 回答日時:
PGMについては詳しくないですが・・・ググってみました.
http://www.wdic.org/w/TECH/PGM
これ見ると・・・最初の方にヘッダーのようなデータがあるみたいですが・・・.
そのプログラムではそれを無視しているように見えます.
No.1
- 回答日時:
>出力画像のテキストデータが文字化けしてしまいます。
テキストデータとして扱っていないんですから当然かと思われますが……。
# そもそも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フォーマットにはなっていないので減点です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ファイル形式またはファイル拡...
-
シェルコマンドの 2>&1 とはど...
-
ファイルの文字コードをUTF-8に...
-
raw形式からbmp形式への書き込...
-
VC++でUTF-8のファイルを出力し...
-
(VBA)書式が変更されてしまい...
-
コマンド(例えばls)の出力結果...
-
COBOLのファイル出力
-
Wordマクロで指定したフォルダ...
-
Acccess レポートをグループ別...
-
AccessVBA複数レポート条件毎に...
-
C言語初心者の質問失礼します。
-
Wordファイルの結合
-
SGファイルって何ですか?
-
フルパスから最後のディレクト...
-
バッファとは何ですか
-
FTPでputすると空ファイルが出...
-
営業秘密の漏洩について
-
実行ファイルと実行モジュール...
-
絶対パスの絶対て英語で何でし...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ファイル形式またはファイル拡...
-
Acccess レポートをグループ別...
-
CSVファイルを任意の場所に出力...
-
テキストファイルに改行コード...
-
コマンド(例えばls)の出力結果...
-
シェルコマンドの 2>&1 とはど...
-
ファイルの文字コードをUTF-8に...
-
(VBA)書式が変更されてしまい...
-
BitBltについて。
-
SendKeys "^V", True(貼り付け...
-
Excel のページを Jpegファイル...
-
【ExcelVBA】UTF-8(BOM無)でC...
-
VB.NETでExcelファイルを出力す...
-
AccessVBA複数レポート条件毎に...
-
raw形式からbmp形式への書き込...
-
Paiza Cloudです。 どうやれば...
-
OCRで起こしたテキスト文字をCS...
-
Wordマクロで指定したフォルダ...
-
C言語での縦方向のファイル出力...
-
VC++でUTF-8のファイルを出力し...
おすすめ情報