ifstream::openについて – プログラミング – Home

通知
すべてクリア

[解決済] ifstream::openについて


reshia
 reshia
(@reshia)
ゲスト
結合: 20年前
投稿: 117
Topic starter  

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

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

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

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

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


引用未解決
トピックタグ
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

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

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

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


返信引用
reshia
 reshia
(@reshia)
ゲスト
結合: 20年前
投稿: 117
Topic starter  

そうなのですか??つまり、
Windowsなら、\r\nまたは\nだけが
Macは、\rまたは\nが
UNIX/Linuxは\nだけが
プログラム中の「\n」に反応(?)するということですか?

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


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

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

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

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


返信引用
reshia
 reshia
(@reshia)
ゲスト
結合: 20年前
投稿: 117
Topic starter  

んー。こうなってくると、今更ですけど
「文字コード、改行コードを統一してくれ!」
と叫びたくなりますね(まぁ、実際何回か叫んでますけど)。

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


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました