6

c fread()呼び出しで単純なテキストファイルから読み込もうとすると、非常に奇妙なエラーが発生します。
私はそのエラーを示すために非常に単純なプログラムを作成しました:

int main(int argc ,char ** argv) {
  FILE* fh = fopen("adult.txt","r");
  if(fh==NULL){
    printf("error opening file\n");
    exit(0);
  }

  int s = 1000;
  printf("cur before=%d\n",ftell(fh));
  char* b = malloc (sizeof(char)*s);
  int k =fread(b,sizeof(char),s,fh);
  printf("cur after reading %d bytes =%d\n",k,ftell(fh));

  return EXIT_SUCCESS;
}

そして、私が出力として得るもの:

cur before=0
cur after reading 1000 bytes =1007

それは正常ですか?freadは数値「1000」を返しますが、カーソル(ftell()を使用)は1007を示しており、助けていただければ幸いです。

4

3 に答える 3

11

それは正常です。

'\n'は 2 文字で表すことができるため、取得しているスキューがあります。

これが発生したくない場合は、ファイナリーをバイナリ モードで開きます。

于 2012-05-18T10:43:05.350 に答える
6

のドキュメントからftell:

またはバイナリ ストリームの場合、返される値はファイルの先頭からのバイト数に対応します。テキスト ストリームの場合、値がファイルの先頭からの正確なバイト数であるとは限りませんが、返された値を使用して、fseek を使用して位置インジケータをこの位置に復元することができます。

そうです、これは正常です。

于 2012-05-18T10:45:36.180 に答える
1

Let_Me_Be の答えは正しいです。ここで説明しているのは、「行末」(EOL) 文字が基盤となるオペレーティング システムに依存していることです。たとえば、Windows で 'r' (または Binary ではない) を使用してファイルを開くと、'\r\n' のシーケンスがある場合、OS は '\n' のみを返します。同様に、バイナリ モードで開かれていないファイルに書き込むと、Windows では単に '\n' と書き込むと '\r\n' と書き込まれます。Unix システムの場合、OS によるそのような変換は行われません。従来の Mac では行末文字に '\r' を使用していましたが、今では EOL に '\n' を使用していると思います。「\n」という流行語が(おそらく)複数の文字(\r\n)で表されることを願っています。

于 2012-05-18T11:48:48.057 に答える