2

配列の任意のインデックスを開始インデックス、つまりファイルから読み取る場所として設定できますか? その過程でバッファが破損するのではないかと心配しました。

#include <stdio.h>

int main()
{
    FILE *f = fopen("C:\\dummy.txt", "rt");

    char lines[30]; //large enough array depending on file size

    fpos_t index = 0;

    while(fgets(&lines[index], 10, f)) //line limit is 10 characters
    {
        fgetpos (f, &index );
    }

    fclose(f);
}
4

3 に答える 3

1

できますが、コードはファイルの内容全体を読み取ろうとしているため、fread を使用してより直接的に行うことができます。

char lines[30];

// Will read as much of the file as can fit into lines:
fread(lines, sizeof(*lines), sizeof(lines) / sizeof(*lines), f);

そうは言っても、本当に行単位で安全に読みたい場合は、 fgets 行を次のように変更する必要があります。

// As long as index < sizeof(lines), guaranteed not to overflow buffer
fgets(&lines[index], sizeof(lines) - index, f);
于 2010-07-13T03:41:30.330 に答える
0

lines[index]配列のインデックス番目の文字ですlines。そのアドレスは index 番目の行ではありません。

特定の行、たとえば 5 行にスキップしたい場合、5 行目を読むために、4 行を読んで何もしないと、次の行を読んで何かをします。

ファイル内の特定の BYTE にスキップする必要がある場合、使用したいのは fseek() です。

また、 fgets に読み取るように指示するバイト数 (10) が、行を挿入する配列のサイズ (30) と同じになるように注意してください。したがって、現在はそうではありません。

その行内の特定の文字から始まる行の一部を読み取る必要がある場合でも、行全体を読み取る必要がある場合は、先頭以外の場所から始まる行のチャンクを使用することを選択してください。

これらの例はどちらも、Web サイトやライブラリからドキュメントの一部を要求するようなものです。ページを切り開くのではなく、ドキュメント全体を取得し、必要なものにフリップする必要があります。

于 2010-07-13T03:13:36.073 に答える
0

このようなものではありません。ファイル内の別の場所に移動する fseek という関数があります。

コードは、(ファイルの別の部分を読み取るのではなく) バッファーの別の部分にファイルを読み取ります。

于 2010-07-13T03:16:07.753 に答える