2

文字で構成されたTXTファイルを読み取り、それらの文字のASCII値をoutput.txtに書き込んでいます。

ASCIIテーブル(ラインフィード)で文字番号10を読み取ると、出力ファイルで10ではなく13を取得してから10を取得します。(13はASCIIでのキャリッジリターンを意味します)

これが私のコードです:

 in_file = fopen(FILE_NAME, "rb");
...
  while((ch = fgetc(in_file)) != EOF){
    count++;
    fprintf(p, "%d\n", ch);
  }

ありがとう

4

3 に答える 3

5

入力ファイルは、Windows の改行でフォーマットされています。これは、 \r\n. UNIX テキスト ファイルには\n. したがって、出力は正しいです。

于 2013-03-14T15:31:16.780 に答える
1

文字 10 は改行 ( \n) です。文字 13 はキャリッジ リターン ( \r) です。Windows の行末記号は、通常、キャリッジ リターンとそれに続くラインフィードです。UNIX/Linux では、通常、行末記号は単なる改行です。Mac OS では、これは単なるキャリッジ リターン IIRC でしたが、OS X ではそうではなくなった可能性があります (ボンネットの下に UN*X があるため)。

@jazzbassrob が指摘しているように、このファイルは Windows システムで作成された可能性があります。
または、Windows システムで実行している場合は、I/O ライブラリ関数の一部の実装によって、UNIX スタイルの行末文字が Windows スタイルに変換されると思います。

したがって、他の投稿者が指摘したように、出力はおそらく正しいでしょう。

編集:への呼び出しから を
削除してみてください。ファイルをバイナリモードで開きます。「テキスト」モードでは、つまり、キャリッジ リターンを破棄できます。bfopen()fopen(FILE_NAME, "r")fgetc()

編集2:テキストモードでは、行末記号は改行に「正規化」する必要があります(@DevSolarが指摘しているように)。一方、バイナリ モードでファイルを開く場合は、特定の文字が行末記号であると想定したり、それに依存したりしないでください。(入力ファイルの作成を制御しない限り、ある形式から別の形式への変換などに特に関心があります。)

于 2013-03-14T15:45:19.707 に答える
0

0x0dバイナリモードでファイルを読み取るため、キャリッジリターン( )を読み取ります"rb"。このようにして、fgetc()は(キャリッジリターン)0x0dが続くすべての文字を読み取ります。0x0a

ファイルをテキストとして開くと"r"、fgetc()は0x0difの後にスキップし、。0x0aのみを表示します0x0a

于 2013-03-14T15:49:07.387 に答える