Новичок в 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. Я очень смущен в целом. Любая помощь будет оценена!
Если ты пишешь while (c != ' ' || c != '\n' || c != '\t')
, то это условие всегда будет выполняться независимо от значения c
(потому что для любого c
, это наверняка либо отличается от ' '
ИЛИ отличается от '\n'
).
Ты наверное имел ввиду while (! (c==' ' || c !== '\n' || c == '\t')) { ...
,
Отметим далее, что — поскольку вы пометили вопрос с помощью C ++, вы можете использовать cin >> aString
, который автоматически пропускает любые пробелы и просто подсчитывает, как часто эта операция завершается успешно.
У вас небольшой логический поток в вашей программе. Проблема в вашей функции skip_char.
Посмотрите на эту строку:
while (c != ' ' || c != '\n' || c != '\t')
Подумайте, что произойдет, если вы, например, читатель. Условие должно быть:
while (c != ' ' && c != '\n' && c != '\t')
Я настоятельно рекомендую понять, почему ваше состояние не так, а также узнать, как самостоятельно находить такие ошибки, например, подумать, какую печать вы можете добавить для своего кода, чтобы найти эту ошибку. Другой вариант — попытаться ознакомиться с отладчиком, который работает в системе, в которой вы работаете.