標準C言語のストリームの定義の解釈の仕方が分からない…
こんばんは。初歩的な内容で大変申し訳ないのですが質問させていただきます。
テキストファイル・バイナリファイルについて学習をしていたところ、標準C言語のテキストストリーム・バイナリストリームについての定義を見つけたのですが、その定義部分についてよくわからない部分があります。
###テキストストリーム・バイナリストリームの定義(分からなかった点を抜粋)
私が学習に使用しているテキストには、テキストストリームについての定義がつぎのように表記されていました。
<テキストストリーム>
➀「行」を構成する,一連の順序付けられた文字の並びである。
各行は、0個以上の文字に、行の終端を表す改行文字を付加したもので、テキストストリームの最終行が、終端を表す改行文字を必要とするかどうかは処理系定義である。
➁ホスト環境内でテキストを表現するための規約に適合させるために、入力と出力の際に文字を変更・付加・削除しても良い。
➂テキストストリームから読み取られるデータが、そのストリームに書き込まれたデータと比較して一致することが保証されるのは、次の条件を満たす場合に限られる。
・データが表示文字と水平タブ,改行文字のみで構成される。
・改行文字の直前に空白文字がない。
・最後の文字が改行文字である。
etc...
<バイナリストリーム>
・バイナリストリームから読み取られるデータは、同一の処理系のもとでは、以前にそのストリームに書き込まれたデータと比較して一致しなければならない。
etc...
自分の解釈・疑問点
1:fputc() や fgetc() のように、1つの文字をテキストストリームに読み書させる際は、ストリームの➀の定義に外れることになるのでしょうか?(外れるとしたらどうなるのですか…)
2:➁の定義における3つの規則は、読み込まれるとき・書き込まれるときのテキストストリーム上のデータの状態を指し、読み込み・書き込みの際の両方でストリームのデータがその条件を満たしていなければならない,ということなのでしょうか?
(例えば、書き込むデータが "abc\n" で、読み込まれる際も "abc\n" として読み込まないと条件を満たさない?)
3:バイナリストリームは、テキストストリームと違い文字の変換などは行わないですよね?
(改行文字の変換は行われないなど?)
見当違いな解釈をしている気がしてなりません…(間違えていると思います)
大変初歩的な質問で本当に申し訳ないのですが、上記の定義の正しい解釈についてご教授して下さると幸いです。
どうか宜しくお願いします。
調べてみたのですが…
マイクロソフトや IBM のサイトに記載されているものを拝見させていただいたのですが、同じような記述で私には良く分かりませんでした…
参考にしたテキスト
定義については、新明解シリーズのC言語に記載してあったものを引用させていただきました。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答6件
0
こんにちは。
標準C言語のストリームの定義の解釈の仕方が分からない…
そもそもC言語にストリームの概念はないですよ。
テキスト・ファイルとバイナリ・ファイルの差はありますが、これはWindowsがこの2つを(悲しいかな)厳密に区別するから、それに引きずられているだけかも知れません。
【09/04追記】
規格書(の無料で見れるドラフト)をみてみました。
316ページ「7.21.2 Streams」に記載されています。
規格書にもテキスト・ストリーム、バイナリ・ストリームは定義されていました。位置づけとしてはこれらの条件に該当するものはテキスト・ストリーム、バイナリ・ストリームとしてサポートするというものでしたので、これら以外を許さないという書き方ではなかったです。(質問文にも特にそのような記述があるわけではないので、ここは私の解釈ミスですね。ごめんなさい。)
- ターミナル、テープ・ドライブ、構造を持つ(フォルダのあるという意味でしょう)ストレージ・デバイスについて、テキスト・ストリームとバイナリ・ストリームをサポートするそうです。
他の形式を使ってはいけないという記述ではないです。またメモリ・ストリームは含まないようです。
2. テキスト・ストリームは要するに、入出力時に改行文字コードを追加/削除するので書いたものと書かれたもの(読み出されたものではないです)が1対1対応するとは限らないそうです。そして、書いたものと読み出されたものが一致する条件が3つ書かれてます(質問文の3つと同じ)。
「改行文字の直前に空白文字がない。」の記載もありました。行の終わりにスペースを書くこともありますから、一般的なテキスト・エディタで書かれたテキスト・ファイルはこの条件から外れそうです。BOM付きファイルも全部外れますね。
3. バイナリ・ストリームは書いたものと読んだものが一致する、ただし、null文字をストリームの最後に付け加えても良いそうです。
書いた時にはなかったnull文字が最後に追加されていることがあるという意味ですね。HDDなどのセクタ・サイズに合わせるパディングを意識したものと思われますが、バイナリ・ファイルは書いたときと同じサイズで読み出せることを当てにすることが多いので新鮮な驚きです。
更に記述は続いてますが、議題からは外れると思いますので割愛します。
以上を踏まえて改めて回答します。
1:fputc() や fgetc() のように、1つの文字をテキストストリームに読み書させる際は(以下略)
処理系が最終行の終わりに改行文字を要求する場合は、最後に1つの改行文字を出力しておけば定義①内です。
処理系がそれを要求しないなら、何をしようと定義①内と思います。
2:➁の定義における3つの規則は(以下略)
これは「③の定義」の間違いでしょうか?
書いて読んだ時に同じ値が読み出せると条件を満たすことになります。実際にメディアに書かれる内容がそれと一致する必要はありません。
3:バイナリストリームは、テキストストリームと違い文字の変換などは行わないですよね?
(改行文字の変換は行われないなど?)
その通りですね。
書いて読んで一致ですから、通信デバイスはバイナリ・ストリームの条件を満たさないと思います。
ただ、私が間違っている可能性があります。もしかすると相手が書いて自分が読んで一致する場合に条件を満たすかもしれません。(通信相手が同じ処理系であることが条件にありますので、該当しない場面がかなり多いとは思いますが。)
投稿2018/09/03 13:25
編集2018/09/04 03:11総合スコア23272
0
ベストアンサー
まず、これは、ファイルがバイトの並びでないようなOS(メインフレームとか)も考慮した記述であり、Unix系OSもWindowsもファイルはバイトの並びなので、テキストストリームもバイナリストリームも大きな違いは無いです。Windows以外に於いてはどちらも無変換で読み書きされますし。
(追記)質問中の文章は、JIS規格書の引用のようですが、規格書はいろいろな環境やコンパイラを許容するために、ややわかりにくい記述になっています。どんな環境を許容するためにこういう記述になっているのかとかは、規格中に書いてないんですよね。
1:fputc() や fgetc() のように、
定義に外れません。
(追記)1行を一度に出力する必要はありません。改行文字が出力された時点で、そこまでが1行になります。
2:➁の定義における3つの規則
とは何のことでしょうか?
3:バイナリストリームは、テキストストリームと違い文字の変換などは行わないですよね?
一般的にはそうです。変換しません。
この記述だけ満たせば良いなら、書くときに可逆変換して、読むときに逆変換して、書いたデータと読んだデータが常に一致すれば良いことになりますが。
##追記
「ファイルがバイトの並びでないような」というのは、「ファイルがレコードの並び」であるケースです。
この場合、テキストストリームだと、プログラム上の行がファイルのレコードにマッピングされます。
プログラムから改行文字を出力すると、今書いているレコードに書くのをやめて、次からは次のレコードに書くことにします。改行文字自体はファイル中に保持されません。
レコードが固定長の場合、行末の空白の有無を判断できないので、③のような記述になります。例えば、空白でパディングするレコード長10のファイルの場合、"ABC"と書いたのか、"ABC "と書いたのか、ファイルを見ても判断できません。
投稿2018/09/03 13:20
編集2018/09/03 15:26総合スコア84423
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/09/03 14:30
2018/09/03 14:48
2018/09/03 15:32
2018/09/03 15:55
2018/09/03 15:59
2018/09/03 16:08
2018/09/03 17:48
2018/09/04 01:43
2018/09/04 07:29
2018/09/04 07:38
2018/09/04 07:38
2018/09/04 08:05
2018/09/04 09:11
2018/09/04 09:19
2018/09/04 09:31
2018/09/04 09:43
2018/09/04 11:44
2018/09/04 13:36
2018/09/04 13:50
2018/09/04 14:39
2018/09/04 15:20
2018/09/04 15:39
2018/09/05 08:51
2018/09/05 11:04
2018/09/05 12:54
2018/09/05 12:56
2018/09/05 13:01
2018/09/05 13:16
2018/09/05 13:50
2018/09/05 13:55
2018/09/05 14:41
2018/09/05 16:02
2018/09/05 21:11
2018/09/05 23:01
2018/09/06 01:03
2018/09/06 06:33
2018/09/06 06:34
2018/09/06 06:46
2018/09/06 16:25
2018/09/06 23:37
2018/09/07 01:12 編集
2018/09/07 04:58
2018/09/07 11:10 編集
2018/09/07 11:41
2018/09/07 12:02
2018/09/07 12:33
2018/09/07 12:34
2018/09/07 12:36
2018/09/07 12:40
2018/09/07 12:46
0
1:fputc() や fgetc() のように、1つの文字をテキストストリームに読み書させる際は、ストリームの➀の定義に外れることになるのでしょうか?(外れるとしたらどうなるのですか…)
いいえ、外れません
2:➁の定義における3つの規則は、読み込まれるとき・書き込まれるときのテキストストリーム上のデータの状態を指し、読み込み・書き込みの際の両方でストリームのデータがその条件を満たしていなければならない,ということなのでしょうか?
(例えば、書き込むデータが "abc\n" で、読み込まれる際も "abc\n" として読み込まないと条件を満たさない?)
②とは③の間違いでしょうか? ③と解釈して答えます。
違います。テキストストリームでは、読み込むときと書き込むときとでは内容が異なる場合があるということです。
3:バイナリストリームは、テキストストリームと違い文字の変換などは行わないですよね?
(改行文字の変換は行われないなど?)
はい、行いません
細かいことに囚われ過ぎだと思います。重要なことは、バイナリストリームは入力と出力が一致するが、テキストストリームは一致しないことがある、ということだけです。
投稿2018/09/03 13:18
総合スコア1448
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
前に書いた
拡張子とファイルのフォーマット - yumetodoの旅とプログラミングとかの記録
が近いと思うのでどうぞ。
~~Cにはテキストストリームやらバイナリストリームという概念はありません。~~と思ったらそうでもなかったのか・・・
投稿2018/09/03 14:10
編集2018/09/04 04:18総合スコア5850
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/09/03 14:32
2018/09/03 14:47
2018/09/03 14:50
2018/09/03 14:51
2018/09/03 14:58
2018/09/03 21:14
2018/09/04 07:02
2018/09/04 07:45
2018/09/04 08:02
2018/09/04 08:07 編集
2018/09/04 08:13
2018/09/04 08:15
2018/09/04 08:16
2018/09/04 08:17
2018/09/04 09:07
2018/09/05 21:04
2018/09/07 07:20
2018/09/07 08:18
2018/09/07 08:58
2018/09/07 11:43
0
テキストストリームについては、
printf
で書き込んでコンソール出力をコピペするとどうなるか
を考えるとわかりやすい気がします。
最終行に\n
がくっつくかもしれませんし、くっつかないかもしれません。
末尾の空白は消えているかもしれません。
印字不可能文字が?
等で置換されているかもしれません。
使う側としては
テキストモードでファイルを開くとwindowsで"\r\n"←→"\n"の変換が行われてたまにめんどくさい
って事を覚えとくだけでいいと思います。
投稿2018/09/03 16:31
総合スコア15147
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/09/03 16:45
2018/09/03 16:51
2018/09/03 22:54
2018/09/04 05:25
2018/09/04 11:39
2018/09/04 12:28
0
1.外れません。1文字読み込むか書き込むだけ。
2.しなければならない、のではなく、そうなっているってことですね
3.そのとおり
投稿2018/09/03 13:08
総合スコア87719
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/09/03 14:20 編集
2018/09/03 14:24
2018/09/03 14:36
2018/09/03 15:19
2018/09/03 15:29 編集
2018/09/03 15:39
2018/09/03 16:03
2018/09/03 16:13
2018/09/03 16:19
2018/09/03 16:43
2018/09/03 17:33
2018/09/04 01:50
2018/09/04 03:14
2018/09/04 04:13
2018/09/04 04:15
2018/09/04 07:51
2018/09/04 07:56
2018/09/04 10:33
2018/09/04 10:54
2018/09/04 12:17
2018/09/04 13:42
2018/09/05 03:07
2018/09/05 03:17
2018/09/05 04:32
2018/09/05 04:37
2018/09/05 07:57
2018/09/05 08:04
2018/09/05 11:02
2018/09/05 12:37
2018/09/05 19:16
2018/09/05 19:39
2018/09/05 19:41
2018/09/05 19:46
2018/09/05 21:09
2018/09/05 23:00
2018/09/06 03:37
2018/09/06 06:37
2018/09/06 06:43
2018/09/06 16:25
2018/09/06 18:50
2018/09/07 01:04 編集
2018/09/07 01:07 編集
2018/09/07 01:17
2018/09/07 09:25 編集