ifstream::openについて

[戻る]
reshia [HomePage] 2005/01/25(火) 23:10:50
(前回の投稿、深く反省しています。一応、雑談あるかなと探したのですが、
 まさかあんな所に雑談があるとは知らなかったもので・・・)
-----------
環境は、Fedora Core 3です。
コンパイラはGCCを使っていますが、
バージョンは、ちょっと今、調べられません。

次のようにファイルを開きます。
-----------
ifstream ifs;
ifs.open("hoge.txt");
-----------
このとき、テキストモードで開きますよね?
ということは、たとえば、
元のファイルの「\r\n」を読み込めば、自動で「\n」1文字に変換され、
「\n」を書き込めば、自動で「\r\n」として書き込んでくれる
ということですよね。

なのに、読み込んだときに「\r」が残っていたりするのです。
この「自動変換」、実はコンパイラの実装定義だったりしますか?


今、あるテキストファイルを読み込んで、
そのテキストに手を加えた結果を別のファイルに保存しようと
しているのですが、このお陰で出力結果のファイルには
私が意図している部分は「\n」で改行され、
さらに「\r」によって意図しない部分で改行されてしまっています。

何かご存知の方おられましたら、お願いします。

Ban 2005/01/26(水) 00:03:42
規格書を引いたわけではありませんが、その自動変換はその環境ネイティブの
改行コードを対象に行われたはずです。(環境依存をなくすための措置と思われます)

「ネイティブ改行コード」は一般に、
Windows などは \r\n、
Mac なら \r
UNIX/Linux なら \n

少なくとも私は UNIX/Linux で \r\n が \n に自動変換されたことはありませんので、
Linux で変換したければ自分で処理を書く必要があるかと。

reshia [HomePage] 2005/01/26(水) 00:22:54
そうなのですか??つまり、
Windowsなら、\r\nまたは\nだけが
Macは、\rまたは\nが
UNIX/Linuxは\nだけが
プログラム中の「\n」に反応(?)するということですか?

これって、あまり「環境依存をなくすための措置」にはなっていないような・・・
ちょっと、今は試せる環境のない場所にいるので、また明日やってみます。

Ban 2005/01/26(水) 00:34:41
ネイティブな環境でプログラムが動く限り、
テキストの改行が \n で書かれて\n で読まれるなら問題ないですし、
同じソースが \r\n で書かれて \r\n で読まれても問題なく読み書きできます。

憶測ですが、C 発祥の UNIX は伝統的に「ソース互換」の世界なので
こうなったのではないかと。

Linux で改行が \r\n というテキストは標準的な形式ではありませんから、
まず普通に考えて書き出しは \n のままになり、それが正常に読み出せるためには
読み出しも \n が対象になる、と。

reshia [HomePage] 2005/01/26(水) 00:48:58
[[解決]]
んー。こうなってくると、今更ですけど
「文字コード、改行コードを統一してくれ!」
と叫びたくなりますね(まぁ、実際何回か叫んでますけど)。

ま、とりあえず「解決」ということで。

tetrapod 2005/01/26(水) 09:28:23
Excel で「セル内改行」を使って CSV 形式に吐き出すと
"今日は\r良い天気"\r\n
となるので CSV をテキスト形式と言い切ってよいのかどうか多少不安。
バイナリストリームを使わないとうまく扱えなくなってしまいます。
こんなヘンな例もあるということで。

古いスレッドには追加発言できません。