画像入出力のプログラムを書いた(とあるサイトからパクった)のですが、出力画像のテキストデータが文字化けしてしまいます。原因究明お願いします。このプログラムでは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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# C言語のファイル入力が分かりません 2 2022/05/22 06:35
- C言語・C++・C# プログラミングの問題です。至急教えてください。 /***から***/の部分をプログラミングにしてほし 1 2022/10/13 11:48
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VC++でUTF-8のファイルを出力し...
-
コマンド(例えばls)の出力結果...
-
AccessVBA複数レポート条件毎に...
-
C言語のプログラムが異常終了し...
-
CBool関数について VB6とVB.net...
-
ファイルの文字コードをUTF-8に...
-
CUIプログラムにドラッグして1...
-
Acccess レポートをグループ別...
-
OCRで起こしたテキスト文字をCS...
-
ファイル形式またはファイル拡...
-
c言語の質問です。 ランダムに4...
-
シェルコマンドの 2>&1 とはど...
-
VBA でメモ帳へ保存する際の保...
-
サウンド出力のデバイスを選択...
-
C++ fprintf_sの使い方がわからん
-
FORTRANの出力データの左寄せが...
-
二次元配列をクリップボードに...
-
(VBA)書式が変更されてしまい...
-
どんなプログラムを書いても指...
-
C言語初心者の質問失礼します。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コマンド(例えばls)の出力結果...
-
VC++でUTF-8のファイルを出力し...
-
テキストファイルに改行コード...
-
シェルコマンドの 2>&1 とはど...
-
Acccess レポートをグループ別...
-
ファイル出力の場所を指定
-
ファイルの文字コードをUTF-8に...
-
ファイル形式またはファイル拡...
-
Wordマクロで指定したフォルダ...
-
VBSでEXCEL⇒CSV変換で日付の書...
-
VBA でメモ帳へ保存する際の保...
-
二次元配列をクリップボードに...
-
VBA フォルダ見える化のコード...
-
C言語のプログラムが異常終了し...
-
CBool関数について VB6とVB.net...
-
C++ fprintf_sの使い方がわからん
-
1行ずつではなくまとめてファイ...
-
MS-Word で作成した表をLatexに...
-
外国語とCSVについて
-
フォルダにあるPDF情報の抽出(VBA)
おすすめ情報