Mac の fgets はキャリッジ リターン '\r' まで読み取りますか、それとも改行 '\n' にも依存しますか?
理由は、一度に 1 行ずつファイルを読み取るために fgets を使用しているためです。ただし、行末に '\r' のみを使用して Mac ファイルで実行すると、必要なことができません。(Linuxで実行)
相互互換性の問題に対処するためにライブラリ型の関数を書きたくありません。代わりに使用できる別の標準機能はありますか?
Mac の fgets はキャリッジ リターン '\r' まで読み取りますか、それとも改行 '\n' にも依存しますか?
理由は、一度に 1 行ずつファイルを読み取るために fgets を使用しているためです。ただし、行末に '\r' のみを使用して Mac ファイルで実行すると、必要なことができません。(Linuxで実行)
相互互換性の問題に対処するためにライブラリ型の関数を書きたくありません。代わりに使用できる別の標準機能はありますか?
ちょっと待って、「CR を含む mac ファイル」で「Linux で実行」を見逃していました。
OK、答えは次のとおりです。fgets()
ドキュメントでは、行末記号として「改行」を明示的に参照しています。特に Unix/Linux の実装では、行末記号としての CR という古い Mac の概念について聞いたことがあるとは期待できません。fgets
したがって、これらの CR が行末として表示されないのは当然のことです。
アップデート:
問題のほとんどを回避するための私の強い推奨事項はtr
、プログラムを実行する前にファイルを変換するなどのコマンド ライン ユーティリティを使用することです。
C に厳密に準拠している場合はgetdelim()
、システムで使用できる場合は使用してみてください。
MacOS X または MacOS 9 (またはそれ以前) について話しているのですか?
Mac が Mac OS 9 から Mac OS X に移行したとき、Mac OS X は従来の改行である BSD の上に構築されている\r
ため、行末規則が で終わる行から に変更されました。したがって、Mac でも、ではなく で区切られた行を解析します。\n
\n
fgets
\n
\r
で区切られた行を解析したい場合\r
は、自分で行うか\n
、事前にファイルを行末に変換する必要があると思います。
Mac スタイルの行末に対処するためだけにコードを変更してもよろしいですか? 通常の Unix の行末を扱うことはありませんか? それとも、どちらのスタイルも受け入れる関数が必要ですか? それは合理的ではありません。
疑わしいすべてのファイルを TR にパイプして CR を LF に変更し、パイプを読み取ってみませんか。追加のファイルを作成する必要はありません。元のファイルに CR があるかどうかに関係なく、コードは標準の fgets で動作します。
Mac の C ライブラリは「正しいことをする」べきです。
ところで、Linux と Mac はどちらも \r ではなく \n を行末記号として使用します