1

fread を使用して、テキスト ファイルからデータ行を取得しようとしています。プログラムが最初に行うことは、テキスト ファイルを開き、各行の先頭のバイト オフセットを決定することです。

行 1 のバイト オフセットは 0 であり、 で開始されoffset[1]ます。行 2 のバイト オフセットは 45 バイトである可能性があり、これは などに格納されoffset[2]ます。のバイト オフセットはEOFarray[lastline + 1]

ループでは、これらのステートメントを使用して、必要なものを印刷しようとしています。

fseek(fptr, ptr[line], SEEK_SET);
fread(str, sizeof(char),  (  (ptr[line + 1] - ptr[line]) - 2) / sizeof(char) , fptr);
printf("%03ld %03ld %s\n", line, ptr[line + 1 ] - ptr[line], str);

私の fread ステートメントは((ptr[line + 1] - ptr[line]) - 2) / sizeof(char)、印刷する要素の数を使用します。ここでいくつかの懸念があります。

  1. -2 を使用して、改行と改行を考慮しています。私の教授は、改行と改行のために 1 行あたり 2 バイト余分にあると言いました。このように世話をする必要がありますか?プログラムの移植性が低下しますか?
  2. 私のプログラムは、ユーザーの要求に応じて、行の範囲または単一の行を印刷します。複数の行を印刷すると、2 行目の出力が本当に壊れてしまいます。

    印刷行 2 から 4 ... LINE: 2 002 005 123 003 011 123456789¼ü|♥ 004 007 123456789¼ü|♥</p>

最初の列は行番号で、2 番目の列はその行のバイト長であり、バイト オフセットではありません。1行だけ印刷すると、時々壊れますが、常にではありません。

Printing line 1...
001 008 123456☻

fread を適切に使用していないか、テキスト ファイルから読み取って印刷前に一時文字列に格納する方法が非常に奇妙であると考えています。問題に見えるのは?

編集:

わかりましたので、fread を使用するための私のループは、すでに何らかの変数に戻り値を割り当てていました。今までどうしたらいいのかわからなかった。コメントの提案に従って、私は使用しています

count = fread(stuff);
str[count] = '\0';

これで直ったようです。

4

2 に答える 2

2

おそらくnullターミネータを忘れていると思います

char s[] = "ABC"; // {'A', 'B', 'C', '\0'}

s[3] = '\0';

于 2012-05-20T21:59:02.333 に答える
1

str[something] = 0を使用する前に、ある時点で言う必要がありますstr。テキスト ファイルを扱っている場合、ほとんどの場合、0 ターミネータは含まれません。

その何かは、によって返される文字数である可能性がありますfread


補足:sizeof(char)定義上 1 であるため、ばかげているように見えます。

于 2012-05-20T21:59:26.360 に答える