質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

657閲覧

ファイルの内容をASCIIコードで表示

ryohasegawa

総合スコア437

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2017/07/04 08:29

編集2017/07/04 09:41

ファイルを開いてそのファイルの内容をASCII文字で表示したいです。

ファイルは画像ファイルです。
画像ファイルのフォーマット形式はバイナリとASCIIの2種類あり、画像ファイルの種類は6種類に分かれています。
ASCII文字では表示した際、はじめの2文字で画像ファイルの種類の判別ができるので、その判別が目的です。

表示は、アスキー文字で表示できるAZ,az,0~9は表示し、それ以外の表示できない文字は"・"で表示したいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

過去の質問画像ライブラリの作成(PNM)より、対象ファイルはPNM (画像フォーマット)と想定して回答します。

先頭2バイトのマジックナンバーを見ればASCIIかバイナリかは分かるので、ASCII形式ならそのまま表示、バイナリ形式なら一般的なダンプ(16進)表示でよいかと思います。

編集された質問に対しての回答

疑似コードですが、以下のような処理で、目的の動作はできるかと思います。

C++

1ファイルをバイナリで開く 2while( ファイル終端まで){ 3 c = 1byte読み込む 4 if( c が ASCIIのA~Z, a~z, 09の範囲){ 5 cを文字(char)として表示。 6 } 7 else{ 8 "・"を表示。 9 } 10}

投稿2017/07/04 09:37

編集2017/07/04 09:54
can110

総合スコア38233

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ryohasegawa

2017/07/04 09:56

要するに、ファイルの先頭1文字を読み込んで、PだったらASCIIで、数字だったらバイナリデータと判別し、バイナリなら、一般的なダンプ(16進)表示すればよいということですかね?
ryohasegawa

2017/07/04 09:58

編集された回答になんですが、このコードは、バイナリかASCIIか判別した後の事ですよね?
can110

2017/07/04 10:01

ちょっと違います。 Wikipediaによると先頭2バイトが「P1」「P2」「P3」ならASCII、「P4」「P5」「P6」ならバイナリと記載されています。先頭2バイト見ないとだめです。 >バイナリなら、一般的なダンプ(16進)表示すればよいということですかね? でよいと思います。
can110

2017/07/04 10:06 編集

>編集された回答になんですが、このコードは、バイナリかASCIIか判別した後の事ですよね? いえ。ASCIIだろうがバイナリだろうが、 > 表示は、アスキー文字で表示できるA~Z,a~z,0~9は表示し、それ以外の表示できない文字は"・"で表示したいです。 のとおりに表示するコードです。 なのでASCII形式の場合、記号や改行も「・」表示されて見づらくなります。 結局、ASCIIならテキストで開き直してテキストとして処理、バイナリならそのままダンプ表示と処理を分けたほうがよいと思います。
can110

2017/07/04 12:17

質問のフォーマットであれば、そのような方法は不要です。 先頭2バイトだけ見ればよいです。
ryohasegawa

2017/07/04 12:34

そうですね。
guest

0

ファイルを1バイトずつ読み出すとして、1バイトは10進数で0~255の範囲の数字になります。この内、通常、画面に表示できるのは0~9, 記号, A~Z, a~zでその他のデータをそのまま表示すると(例えばprintf関数などで)画面には何も表示されないか、文字化けした文字が表示されたりします。CR(0x0D)やLF(0x0A)などはカーソル位置が変化したりします。
こういう、画面に直接表示できないデータはどうするのでしょうか?
表示できるものだけ選別して表示するのでしょうか?

ファイルの何を表示したいのかがはっきりしないので、これ以上は回答しづらいですね。

投稿2017/07/04 09:02

PineMatsu

総合スコア3579

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ryohasegawa

2017/07/04 09:19

画面に表示できないものは"・"として表示する感じです。
guest

0

ASCII文字からなるファイルを読み込めば、そのままASCIIのデータが得られます。
そのデータをそのまま出力すればいいです。

しかし、16進数が登場するなど、質問文がおかしいような気もします。あなたがASCII文字、ASCIIコードについて誤解している可能性があります。

投稿2017/07/04 08:37

otn

総合スコア84421

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ryohasegawa

2017/07/04 08:39

ファイルのエンコード方式なんですが、ASCIIとバイナリの2種類あり、どちらの場合でも正しく表示したいんです
ryohasegawa

2017/07/04 08:41

ASCIIコードの中のアルファベットと128種類の制御文字がASCII文字ですよね? なので、ASCII文字で表示ですね。
otn

2017/07/04 08:43

> ASCIIとバイナリの2種類あり、 それはどこで何についての記述で出てきた言葉ですか?
ryohasegawa

2017/07/04 08:45

追記しました。
otn

2017/07/04 08:49

何となく分かった気がします。テキストファイルでないファイル(バイナリファイル)を何らかの変換を行ってASCII文字だけで表示したいと言う事でしょうか? その場合アプリオリに「正しく表示」というものはありません。変換方法がいくつもあるので、そのなかのどれかが正しいわけではありません。どのように変換するかを決める必要があります。
ryohasegawa

2017/07/04 08:54

はい。テキストファイルではないファイル(画像)です。 このファイルは6種類あり、エンコードタイプがバイナリ形式とASCII形式とがあり、ASCII形式のはじめの2種類ある感じです。 ASCII文字で表示した場合はじめの2文字でファイルの種類の判別ができます。なのでASCII文字に変換がしたいです。 ASCII文字の表示なのですが、バイナリエディタで採用されている方法がいいです。 変換できる文字は変換で表示できないのは`・`に置き換えられる方法と言えば伝わるでしょうか?
otn

2017/07/04 09:00

hexdump -C で表示されるような形式ですかね。 hexdumpの左の方は、ファイルを1バイトずつ読んで、単に、printf("%02X",~) でいいです。右の方は、コントロール文字か、印字可能文字か、0x80以上の文字かなどを場合分けすればいいかと思います。
ryohasegawa

2017/07/04 09:23 編集

この読み込みはどういう風に読み込めばいいですか?
otn

2017/07/04 11:33

> この読み込みはどういう風に読み込めばいいですか? fopenして、getcです。 このレベルの質問が出ると言うことは、まだ自分でプログラムを書くレベルに達していないと思います。
ryohasegawa

2017/07/04 12:25

ifstream ifs(ファイル名); で読み込むコードを書いていたんですが、これを普通に表示でいいですね。 あとは、0x80以上の文字の場合を考えます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問