0

ファイルの単語リストをchar*に保存しようとしています。最大行数や最大文字数を想定していません。そこで、これに対抗するために、.txtファイルを実行して行数と最大文字数を見つけ、char *listにメモリを割り当てることにしました。

ただし、GDBを使用してプログラムをデバッグすると、ファイルの2番目の実行をスキップしてwordsに格納します。なぜこれを行うのですか、どうすれば修正できますか?ありがとう!

void readFile(int argc, char** argv)
{
    FILE *myFile;
    char** list;
    char c;
    int wordLine = 0, counter = 0, i;
    int maxNumberOfChars = 0, numberOfLines = 0, numberOfChars = 0;

    myFile = fopen(argv[1], "r");

    if(!myFile)
    {
        printf("No such file or directory\n");
        exit(EXIT_FAILURE);  
    }

    while((c = fgetc(myFile)) !=EOF)
    {
        numberOfChars++;
        if(c == '\n')
        {
            if(maxNumberOfChars < numberOfChars)
                maxNumberOfChars += numberOfChars + 1;

            numberOfLines++;
        }
    }

    fseek(myFile, 0, SEEK_SET);

    list = malloc(sizeof(char*)*numberOfLines);

    for(i = 0; i < wordLine ; i++)
        list[i] = malloc(sizeof(char)*maxNumberOfChars);


    while((c = fgetc(myFile)) != EOF)
    {
        if(c == '\n' && counter > 0)
        {
            list[wordLine][counter] = '\0';
            wordLine++;
            counter = 0;
        }
        else if(c != '\n')
        {
            list[wordLine][counter] = c;
            counter++;
        }
    } 
    fclose(myFile);
}
4

4 に答える 4

3

2番目のループの前に、fseekを使用してファイルの読み取りポインターをリセットする必要があります。

このようなものを追加します

fseek(myFile, 0, SEEK_SET);

また

rewind(myFile);

@ThomasPadron-McCarthyに感謝します。

于 2013-02-09T10:20:00.077 に答える
0

まず第一に、それは非常に遅いのであなたのテクニックは悪いです。メモリを割り当てて、さらに必要な場合はreallocを使用できます。

2番目:ファイルでstat()を使用して、サイズを知ることができます。その中の行数はわかりませんが、役に立つかもしれません。

3番目:fseek()を使用して、カーソルをファイルの先頭に戻し、通常はファイル内の任意の位置に戻すことができます。

于 2013-02-09T10:21:30.990 に答える
0

もう一度読む前に、rewind(myFile)を使用してください。

rewind(myFile)
于 2013-02-09T10:23:09.450 に答える
0

ただし、文字数を確認するためだけにファイル全体を読み取る必要はありません。この構造を使用できます

struct stat file_stat;
fstat(file_id, &file_stat);
int size_to_read = file_stat.st_size - 1;

オンラインでreallocを使用できるため、行数を知る必要はありません。

list=realloc(list,(sizeof(char*)));
于 2013-02-09T10:32:40.770 に答える