0

char ポインター (*seqA) のサイズを動的に増やすために realloc を使用します。より良い別の方法はありますか?

それは私のコードの一部です:

    while((holder=fgetc(fileA)) != EOF) {
    lenA++;
    temp=(char*)realloc(seqA,lenA*sizeof(char));
    if (temp!=NULL) {
        seqA=temp;
    seqA[lenA-1]=holder;
    }
    else {
        free (seqA);
        puts ("Error (re)allocating memory");
        exit (1);
    }
}
4

2 に答える 2

1

コードがファイル全体を文字列に読み込んでいるので、次のコードを使用してみませんか。

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

....

struct stat buf;
fstat(fileno(fileA), &buf);
seqA = malloc(buf.st_size);
fread(seqA, buf.st_size, 1, fileA);

もちろん、これらの関数の戻り値を確認し、適切なアクションを実行する必要があります。

于 2013-03-04T12:15:44.623 に答える
0

なぜあなたのアルゴリズムのそのような小さな部分に疑問を抱くのでしょうか? アルゴリズム全体をより全体的に見てみるとよいでしょう。現在のアルゴリズムは、このかなり集約的で不要なコードに依存しています。ファイル全体をメモリに読み込むというこの依存関係を取り除くことができれば、ソリューションははるかにスケーラブルになります。おそらく、「これをより適切に行う方法」とは、「より高速に」または「サイズが 100GB のファイルをクロールを停止することなく処理できるようにする」という意味です。

ファイルから必要な情報を一度に 1 バイトずつ読み取り、処理し、抽出できる有限状態マシンを考えてみましょう。おそらくmallocはそれほど必要ないでしょう。問題の具体的な説明がなければ、問題を解決するための有限状態マシンを導き出すことはできません。ただし、100 GB のファイルで最大の整数を見つける場合は、際立った例の 1 つです。

while (fscanf(file, "%d", &current_num) == 1) {
    if (current_num > max_num) {
        max_num = current_num;
    }
}

このコードは明らかに malloc を必要とせず、ましてやファイル全体をメモリに読み込む必要はありません。ファイルのサイズに関係なく、一定量のメモリしか使用しません。

于 2013-03-04T14:42:26.517 に答える