0

しばらくCプログラミングを行っていませんが、文字列を出力する次のものがありますが、それを配列に入れて操作できるようにしたいと思います(コード)。配列のサイズを宣言する必要があると思いますが、可変量を処理する必要があります。のようなことを考えていましsystem('wc -l filename')たが、それは本当にひどいですね。より良い方法でなければなりません:

#include <stdio.h>

int main()
{
    char *inname = "test.txt";
    FILE *infile;
    char line_buffer[BUFSIZ]; /* BUFSIZ is defined if you include stdio.h */
    char line_number;

    infile = fopen(inname, "r");
    if (!infile) {
        printf("Couldn't open file %s for reading.\n", inname);
        return 0;
    }
    printf("Opened file %s for reading.\n", inname);

    line_number = 0;
    while (fgets(line_buffer, sizeof(line_buffer), infile)) {
        ++line_number;
        /* note that the newline is in the buffer */
        // ---------------------
        // would like to put into an array of strings here rather than just printf'ing out out

         printf("%4d: %s", line_number, line_buffer);
    }
    printf("\nTotal number of lines = %d\n", line_number);
    return 0;
}
4

3 に答える 3

2

初めに:

char *inname = "test.txt";

する必要があります

const char *inname = "test.txt";

次に、すべての行を格納するのに十分な大きさの配列を割り当てます。事前に行数がわからないため、指数関数的なストレージ拡張を使用できます。つまり、配列が使い果たされたときに配列のサイズを 2 倍にします。

サンプル コード (わかりやすくするためにエラー チェックは省略されています。これを製品コードにコピー アンド ペーストしないでください):

size_t n = 0;
size_t alloc_size = 4;
char buffer[LINE_MAX];

char **arr = malloc(alloc_size * sizeof arr[0]);

while (fgets(buffer, sizeof buffer, fp) != NULL) {
    if (++n > alloc_size) {
        alloc_size *= 2;
        arr = realloc(arr, alloc_size * sizeof arr[0]); // don't do this
    }

    arr[n - 1] = strdup(buffer);
}
于 2013-11-09T20:35:01.473 に答える
1

残念ながら、C には動的配列はありません (C++ で vector のようなものを考えている場合)。リストを使用して、ファイルから行を読み取るたびに、リストの最後に新しいリスト エントリを追加するだけです。

VLA (可変長配列) と呼ばれる C99 以降の「動的」配列もあります。動的サイズで配列を宣言できます(または、プログラムの実行中に知られています)が、以前のものよりも大きなサイズで新しい配列を毎回宣言し、古いものから新しいものにコンテンツをコピーする必要があるため、これは問題の解決には役立ちません-これは非常に非効率的です。

したがって、リストよりも優れたものを見つけるのは難しいかもしれません。

于 2013-11-09T20:36:12.810 に答える
1

ファイル全体を調べて(ファイルが大きい場合は遅くなります)、すべての「新しい行」を数えることができます。次に、このカウント サイズで配列を作成し、ファイルを巻き戻してすべての行を読み取ります。

製造

于 2013-11-09T20:49:11.810 に答える