4

タイトルがそれ自体を物語っていると思います。

ファイルの内容を比較するg++とNotepad++を使用して、Windows7でCプログラムをコーディングしています。

ファイルの内容:

simple
file with lines

ファイルの行末はWindowsスタイルのCRLFです。

このコードを使用してファイルの長さを数えると、次のようになります。

fseek(file, 0, SEEK_END);
size = ftell(file);
fseek(file, 0, SEEK_SET);

私は23を取得します。

行末をUnix形式のLFに変更すると(Notepad ++を使用)、22の長さになります。

これは、2つのファイルを比較するときに一種の問題を引き起こします。そのため、特定のファイルにLF、CR、またはCRLFがあるかどうかを判断する方法があるかどうかを尋ねます。

CRとLFを区別できることはわかっています。LFのASCIIコードは10、CRのASCIIコードは13です。または、LFは「\ n」、CRは「\r」です。

しかし、charの後にfile charを読み取ると、CRLFがある場合でも、常にLF(ascii 10)が返されます。

はっきりさせておきたいと思います。ありがとう。

4

2 に答える 2

3

これが、テキストモードとバイナリモードでのファイルの読み取りの違いです。

テキストモード(関連するパラメータでfopen、fopen( file, "r") 次にgetcなど)では、すべての行末が1文字として読み取られます。たとえば、バイナリモードで読み取るとfopen(file, "rb")、実際のバイトが取得され、CRLFとCRが異なるものとして表示されます。fseekは実際のバイト数を使用するため、行末の違いを確認します。

そして、それを知る唯一の方法は、2つの異なる方法でファイルを読み取り、CRLFペアがあるかサイズが異なるかどうかを確認するか、実際には、現在の主要なOSがそれを使用しているとは思わないのでLFがあるかどうかを確認することです。ラインファイルとして。

于 2012-10-28T11:35:50.197 に答える
2

マークの答えに加えて、すでに開かれているファイルハンドル(stdinまたはなどstdout)に対してこれを行う必要がある場合は、次を使用できます_setmode()

#include <fcntl.h>
#include <io.h>

...

_setmode(fileno(stdin), _O_BINARY);

これは、そのファイルハンドルに対して入力または出力がまだ発生していない場合に機能します。ちなみに、_setmode()WindowsとDOSにのみ存在します。Unixライクなオペレーティングシステム(OSX以降のバージョンのMacOSを含む)では、ファイルは事実上常にバイナリモードで開かれ、fopen(file, "...b")受け入れられますが効果はありません。これらのプラットフォームでは、行末は1文字でエンコードされ\nます。

于 2012-10-28T11:38:01.437 に答える