1

バイナリ ファイルを読み取った場合、次を使用して n 番目の行を見つけることができます。

fseek(fp, 4*sizeof(line),SEEK_SET);

ただし、C で txt ファイルを読み取る場合は、次のようになります。

1 1 2.2
2 3 3.001
3 4 5

実際の場合、double 値は 2.2 または 3.0001 または 5 になる可能性があるため、1 行のバイト サイズを保証できません。今回は fseek を使って n 番目を見つけるにはどうすればよいでしょうか??

ありがとう!

4

4 に答える 4

6

基本的に、行の長さが可変の場合にn行目をどのように見つけるかを尋ねています。

これを行う唯一の方法は、ファイルを調べて'\n'文字数を数えることです。

于 2012-08-28T11:06:31.210 に答える
2

簡単に言えば、可変レコード長のファイルではランダム シークを実行できないということです。これは、可変レコード長に移行するときに支払う代償です。パディングによって、可変レコード長を固定レコード長に変換できます。ただし、追加のストレージ コストが発生します。ランダム シークが重要な場合は、妥協する価値があります。

于 2012-08-28T11:06:58.037 に答える
2

できません; テキスト ファイルには、行の長さに関する情報は含まれていません。

各文字を読み取り、行末文字を数える必要があります。それが遅すぎる場合は、(このファイルのヘッダーまたは別のファイルのいずれかで) 行位置の別のインデックスを維持するか、フォーマットを変更して固定長レコードを使用することができます。

于 2012-08-28T11:07:51.173 に答える
0

できません。ファイルを読み進めながら、行末を数えなければなりません。これに似たもの:

void GotoLine(FILE* File, unsigned int Line)
{
    int c;

    fseek(File,0,SEEK_SET);
    while (Line>0 && (c=fgetc(File))!=EOF)
    {
        if (c=='\n') Line--;
    }
}

(注: エラーチェックなし:-))

于 2012-08-28T11:07:09.710 に答える