2

実行時に受け取る DOS 行末を含むファイルがあるため、行末を UNIX スタイルのオフラインに変換できません。また、私のアプリは Windows と Linux の両方で実行されます。私のアプリはfgets()ファイルに対して実行し、行ごとに読み込もうとします。

Linux で行ごとに読み取られるバイト数も 2 つの末尾の文字を占めるのでしょうか、それとも(\n)(\r \n)のみを含み、\rは基盤となるシステムによって破棄されますか?

編集:

さて、Linux でファイルを読み込んでも行末は保持されますが、別の問題が発生しました。Windows では、「r」または「rb」でファイルを開くと動作が異なります。Linux とは異なり、Windows はこれら 2 つのモードを区別して扱いますか?

4

4 に答える 4

4

fgets()行末を保持します。

http://msdn.microsoft.com/en-us/library/c37dh6kf(v=vs.80).aspx

fgets()それ自体には、行末を変換するための特別なオプションはありませんが、Windows では、ファイルを「バイナリ」モードまたは「テキスト」モードで開くことを選択できます。テキスト モードでは、Windows は CR/LF シーケンス (C 文字列: "\r\n") を単なる改行 (C 文字列: "\n") に変換します。これは、Windows と Linux で同じコードを記述して動作させるための機能です (Windows では "\r\n" は必要なく、Linux では "\n" だけが必要です)。

http://msdn.microsoft.com/en-US/library/yeby3zcb(v=vs.80 )

Windows の への呼び出しは、Linux でfopen()の への呼び出しと同じ引数を取ることに注意してください。fopen()「バイナリ」モードでは、ファイル モードで非標準文字 ( 'b') が必要ですが、「テキスト」モードがデフォルトです。したがって、Windows と Linux で同じコード行を使用することをお勧めします。の Windows バージョンはfopen()そのために設計されています。

C ライブラリの Linux バージョンには、トリッキーな機能はありません。テキスト ファイルに CR/LF 行末がある場合は、それを読んだときに得られるものです。Linuxはオプションでfopen()a を受け入れ'b'ますが、無視します!

http://linux.die.net/man/3/fopen

http://linux.die.net/man/3/fgets

于 2012-07-03T08:43:54.047 に答える
3

Unix では、行は改行まで読み取られ\n、キャリッジ リターンが含まれます\r。端から両方を切り取る必要があります。

于 2012-07-03T06:30:16.553 に答える
1

DOS他の回答は、で読み取られたファイルに対してどのような行末が返されるかという質問に関して満足のいく情報を提供しましたが、そのような行末を切り取るUNIX別の方法について言及したいと思います。

大きな違いは、次のアプローチはマルチバイト文字の保存であり、文字を直接使用しないことです。

if (pszLine && (2 <= strlen(pszLine)))
{ 
  size_t size = strcspn(pszLine, "\r\n"); 
  pszLine[size] = 0; 
} 
于 2012-07-03T06:59:50.053 に答える
0

文字を含め、実際にファイルに含まれているものを取得します\r。UNIX には、テキスト ファイルやバイナリ ファイルはなく、ファイルだけがあり、stdio は変換を行いません。fgets を使用して行をバッファーに読み取った後、次のことができます。

char *p = strrchr(buffer, '\r');
if(p && p[1]=='\n' && p[2]=='\0') {
    p[0] = '\n';
    p[1] = '\0';
}

これにより、終端が に変わり\r\n\0ます\n\0。またはp[0]='\0'、保持したくない場合は、\n.

strchr ではなく、strrchr の使用に注意してください。複数の s が行の途中に存在することを妨げるものは何もありません。おそらく最初\rの行で行を切り詰めたくないでしょう。

質問のEDITセクションへの回答: はい、「rb」の「b」は unix ではノーオペレーションです。

于 2012-07-03T06:34:45.470 に答える