Подсчет количества слов с помощью C из текстового файла - PullRequest
0 голосов
/ 10 декабря 2011

Эй, я пытался посчитать количество слов в моем текстовом файле, чтобы загрузить кучу слов для игры Hangman из C, но я бью кирпичную стену.Предполагается, что этот фрагмент кода, который я использую, использует этот фрагмент кода;

FILE *infile;
        FILE *infile;
char buffer[MAXWORD];
int iwant, nwords; 
iwant = rand() %nwords;

// Open the file

infile = fopen("words.txt", "r");

// If the file cannot be opened

if (infile ==NULL) {

    printf("The file can not be opened!\n");
    exit(1);
}

// The Word count

while (fscanf(infile, "%s", buffer) == 1) {

    ++nwords;
}

printf("There are %i words. \n", nwords);

    fclose(infile);
}

Если у кого-то есть какие-либо предложения относительно того, как это исправить, я был бы очень благодарен.

Текстовый файл содержит 1 слово в строке, 850 слов.

Применил предложение буфера, однако количество слов все еще вышло на 1606419282.

Исправление ввода

    int nwords = 0; 

Сработало !!Большое спасибо!

Ответы [ 3 ]

2 голосов
/ 10 декабря 2011

То есть слова по одной записи в строке?

while (fscanf(infile, "%s", &nwords) == 1); {
    ++nwords;
}

Не делает то, что вы думаете, что делает. Он читает строку в словах, которая не является строкой. Если вы хотите сделать это следующим образом, вам нужно выделить строку, т.е. char buffer[XXX], которая достаточно длинна, чтобы содержать самое длинное залоговое удержание в вашем файле данных, и использовать:

while (fscanf(infile, "%s", buffer) == 1) {
    ++nwords;
}
1 голос
/ 10 декабря 2011

Переменная nwords никогда не инициализируется. Вы не можете предполагать, что оно начинается с нуля.

Если бы это было так, вы бы столкнулись с падением («деление на ноль») на следующей строке, цель которой ускользает от меня:

iwant = rand() %nwords;

Итак, замените

int iwant, nwords; 
iwant = rand() %nwords;

от

int nwords = 0;
0 голосов
/ 10 декабря 2011
  1. После прочтения первого слова и пробела после него ваш fscanf ВОЗВРАЩАЕТСЯ для ввода буфера в пробел.Итак, в следующий раз, когда вы прочитаете ПУСТОЕ слово.
  2. Предлагаемое изменение:

    fscanf (infile, "% s", & buffer) // обратите внимание на пробел !!!И & перед буфером

    Он выбросит ВСЕ пробелы до следующего слова.Это должно работать.


PS Лучше не использовать [f] scanf: -)

...