2

よし、ファイルがあって、それを使って何かをしなければならない。単純化しすぎると、ファイルの形式は次のようになります。

n
first name
second name
...
nth name
random name
do x⁽¹⁾, y⁽¹⁾ and z⁽¹⁾
random name
do x⁽²⁾, y⁽²⁾, z⁽²⁾
...
random name
do x⁽ⁿ⁾, y⁽ⁿ⁾, z⁽ⁿ⁾

したがって、実際の詳細は重要ではありません。問題は、変数 n を宣言する必要があり、配列 name[MAX] があり、この配列に name[0] から name[n-1] までの名前を入力することです。

さて、問題は次のとおりです。自分が何人の名前を持っているかを以前に知らなかった場合、どうすればこの入力を取得できますか?

たとえば、それがキーボードからのユーザー入力であれば、問題なく実行できます。次のようにします。

int n; char name[MAX];
scanf( "%d", &n);
int i; for (i = 0; i < n; i++)
    scanf( "%s", &N[i]);

そして、コード全体を実行することもできますが、要点はわかります。しかし、私の入力はファイルから来ています。入力を取得する方法がわかりません。できることは、ファイル全体を fscanf() することだけですが、そのサイズがわからないため (最初の数値で決定されます)、実行できません。私の知る限り(そうでない場合は訂正してください。私はこれに非常に慣れていません)、コマンド「for」を使用して、キーボードから入力されているかのように数字を徐々に取得することはできませんよね?

したがって、私が目にする唯一の出口は、ファイルから特定の行を読み取る方法を見つけることです。これができればあとは簡単です。問題は、どうすればそれができるかということです。私はそれをグーグルで検索しましたが、そこにはいくつかの質問さえありましたが、まったく意味がありませんでした. どうやら、ファイルから特定の行を読み取るのは非常に複雑です。

これは初歩的な問題集なので、そこまで難しいものではないと思います。それが何であるかはわかりませんが、非常に単純なものが欠けているに違いありません。

では、質問は、たとえば、どのようにしますか?

ファイルから最初の番号 n をスキャンし、次に残りの 'n' 個の名前をスキャンして、それぞれを配列内の要素に割り当てる方法 (名 = 名前 [0]、姓 = 名前 [n - 1]) ?

4

3 に答える 3

1

End Of File を調べることをお勧めします。

while(!eof(fd))
{
...code...
}

私のCの知識はさびていることに注意してください。しかし、これで始められるはずです。

IIRC eof は値 (-1) を返すため、何かと比較する必要があります。ここで fd は、読み込んでいるファイルのファイル記述子です。次に、テキストの解析または行数の後に、「n」が得られます。

編集:私は明らかに疲れているので、私は思っていました(あなたの「n」が一番上にあることに気づきませんでした)。
名前を反復するループの 'n' サイズ配列の最初の行 malloc を読み取ります。

于 2013-02-27T01:48:19.843 に答える
0

ほら、どうぞ。コンパイルとデバッグは、学生の練習問題として残しておきます。

ファイルが常に小さい場合、ファイル全体を単一の配列に丸呑みするという考え方です。これは scanf() よりもはるかに効率的です。

char buf[100000], *bp, *N[1000]; // かなり大きい

memset( buf, '\0', sizeof buf );
if ( fgets( buf, sizeof(buf), fd ) )
{
    int n = 0;
    char *bp;
    if ( buf[(bufのサイズ)-2)] != '\0' )
    { // バッファにはファイルが長すぎます
        printf( stderr, "トラブル: ファイルが大きすぎます: %d\n", (int)(sizeof buf));
        終了 (EXIT_FAILURE);
    }
    // 各 \n を \0 に置き換え、各行がどこにあるかを記憶します。
    for ( bp = buf, bp = strchr( bp, '\n' ); bp++ )
        N[n++] = bp;
}

任意のサイズのファイルを読み取りたい場合は、ファイルをチャンクで読み取る必要があり、読み取りの前に各チャンクを calloc() し、現在のバッファーの最後に残っている行フラグメントを慎重に処理して、それらを次のバッファーに移動し、その後、適切に読み続けます。読み取ることができる行数に制限がない限り、N もチャンクで設定する必要があるかもしれませんが、今回は remalloc() があなたの味方かもしれません。

于 2013-02-27T01:59:04.687 に答える
0

指定された形式は、ファイルの最初のエントリとして名前の数が指定されていることを暗示しているように見えるため、nstdin から読み取るときに OP が記述する読み取りスタイルを使用することができます。を使用fscanfしてファイルから最初の整数を読み取り ( n)、次に を使用mallocして名前の配列を割り当て、次にforまでのループを使用しnて名前を読み取ります。

do x⁽¹⁾, y⁽¹⁾ and z⁽¹⁾ただし、フォーマットに続くサンプルデータの意味がわかりません。おそらく私は質問の一部を理解していません。複数のn名前が存在する可能性があることを意味する場合は、 を使用reallocして配列のサイズを大きくすることができます。珍しくない配列を大きくする 1 つの方法は、毎回長さを 2 倍にすることです。

于 2013-02-27T01:45:46.903 に答える