(前回の投稿、深く反省しています。一応、雑談あるかなと探したのですが、
まさかあんな所に雑談があるとは知らなかったもので・・・)
-----------
環境は、Fedora Core 3です。
コンパイラはGCCを使っていますが、
バージョンは、ちょっと今、調べられません。
次のようにファイルを開きます。
-----------
ifstream ifs;
ifs.open(hoge.txt);
-----------
このとき、テキストモードで開きますよね?
ということは、たとえば、
元のファイルの「\r\n」を読み込めば、自動で「\n」1文字に変換され、
「\n」を書き込めば、自動で「\r\n」として書き込んでくれる
ということですよね。
なのに、読み込んだときに「\r」が残っていたりするのです。
この「自動変換」、実はコンパイラの実装定義だったりしますか?
今、あるテキストファイルを読み込んで、
そのテキストに手を加えた結果を別のファイルに保存しようと
しているのですが、このお陰で出力結果のファイルには
私が意図している部分は「\n」で改行され、
さらに「\r」によって意図しない部分で改行されてしまっています。
何かご存知の方おられましたら、お願いします。
規格書を引いたわけではありませんが、その自動変換はその環境ネイティブの
改行コードを対象に行われたはずです。(環境依存をなくすための措置と思われます)
「ネイティブ改行コード」は一般に、
Windows などは \r\n、
Mac なら \r
UNIX/Linux なら \n
少なくとも私は UNIX/Linux で \r\n が \n に自動変換されたことはありませんので、
Linux で変換したければ自分で処理を書く必要があるかと。
そうなのですか??つまり、
Windowsなら、\r\nまたは\nだけが
Macは、\rまたは\nが
UNIX/Linuxは\nだけが
プログラム中の「\n」に反応(?)するということですか?
これって、あまり「環境依存をなくすための措置」にはなっていないような・・・
ちょっと、今は試せる環境のない場所にいるので、また明日やってみます。
ネイティブな環境でプログラムが動く限り、
テキストの改行が \n で書かれて\n で読まれるなら問題ないですし、
同じソースが \r\n で書かれて \r\n で読まれても問題なく読み書きできます。
憶測ですが、C 発祥の UNIX は伝統的に「ソース互換」の世界なので
こうなったのではないかと。
Linux で改行が \r\n というテキストは標準的な形式ではありませんから、
まず普通に考えて書き出しは \n のままになり、それが正常に読み出せるためには
読み出しも \n が対象になる、と。
んー。こうなってくると、今更ですけど
「文字コード、改行コードを統一してくれ!」
と叫びたくなりますね(まぁ、実際何回か叫んでますけど)。
ま、とりあえず「解決」ということで。
Excel で「セル内改行」を使って CSV 形式に吐き出すと
今日は\r良い天気\r\n
となるので CSV をテキスト形式と言い切ってよいのかどうか多少不安。
バイナリストリームを使わないとうまく扱えなくなってしまいます。
こんなヘンな例もあるということで。