Программа для подсчета слов, считывающая весь файл как одно слово

Новичок в C ++ и программирование здесь

Я хочу написать программу, которая считает количество слов в файле.
Я тестирую его только с одним файлом, но он должен работать для других файлов с другим форматированием, т.е. несколько пробелов. (Я предполагаю, что пока нет проблем с открытием файлов и т. Д.)

Вот мой код:

#include <iostream> // these are the only imports I can use
#include <fstream>
#include <string>

using namespace std;

ifstream fin("story.txt"); // open the file called filename

void skip_space(char c) {
cout << "skip_space()\n";

while (c == ' ' || c == '\n' || c == '\t') { // as long as char is space
c = fin.get(); // get next character from file

if (fin.eof()) { // if eof is raised
return;
}
} // while
return;
}

void skip_char(char c) {
cout << "skip_char()\n";

while (c != ' ' || c != '\n' || c != '\t') { // as long as char is not space
c = fin.get(); // get next character from file

if (fin.eof()) { // if eof is raised
return;
}
}
return;
}void num_words() {
cout << "num_words()\n";
int word_count = 0;
char c = fin.get(); // get first character of file

while (!fin.eof()) { // while not end of file

if (c == ' ' || c == '\n' || c == '\t') {
skip_space(c); // loops until an nonblank character is reached
} else { // if not a blank
word_count++; // increment count
skip_char(c); // loops until a space is reached
}
}

cout << "story.txt" << " has " << word_count << " words\n";
// prints a message to cout indicating the number of words in filename.
// A word is defined as the string that an input stream (such as cin) returns when reading a string value.
}

int main() {
num_words();
}

Вот содержимое файла:

One day
a green
a frog ate a
princess.

Когда я запускаю код, вывод

num_words()
skip_char()
story.txt has 1 words

Проблема в том, что word_count равно 1 вместо 9. Я очень смущен в целом. Любая помощь будет оценена!

0

Решение

Если ты пишешь while (c != ' ' || c != '\n' || c != '\t'), то это условие всегда будет выполняться независимо от значения c (потому что для любого c, это наверняка либо отличается от ' ' ИЛИ отличается от '\n').

Ты наверное имел ввиду while (! (c==' ' || c !== '\n' || c == '\t')) { ...,

Отметим далее, что — поскольку вы пометили вопрос с помощью C ++, вы можете использовать cin >> aString, который автоматически пропускает любые пробелы и просто подсчитывает, как часто эта операция завершается успешно.

0

Другие решения

У вас небольшой логический поток в вашей программе. Проблема в вашей функции skip_char.
Посмотрите на эту строку:

while (c != ' ' || c != '\n' || c != '\t')

Подумайте, что произойдет, если вы, например, читатель. Условие должно быть:

 while (c != ' ' && c != '\n' && c != '\t')

Я настоятельно рекомендую понять, почему ваше состояние не так, а также узнать, как самостоятельно находить такие ошибки, например, подумать, какую печать вы можете добавить для своего кода, чтобы найти эту ошибку. Другой вариант — попытаться ознакомиться с отладчиком, который работает в системе, в которой вы работаете.

0

По вопросам рекламы [email protected]