У вас там довольно много проблем.
Как прокомментировал другой постер, строка:
while (word.length() > 0)
будет зацикливаться вечно, и вам нужно изменить его на:
if (word.length() > 0)
Вы смешиваете целые числа и неподписанные длинные неуместно. Переменные wordCount
и a
и возвращаемое значение из wordFunc()
должны совпадать.
У вас есть inp.close()
внутри цикла чтения, а не снаружи, где он принадлежит. Это означает, что он закроет файл после обработки первой строки.
У вас также есть оператор return внутри оператора if
, означающий, что у вас есть синтаксическая ошибка, не возвращающая ничего по одному пути выполнения (тому, где файл не может быть открыт).
Вам нужно поменять return
и закрывающую скобку, которая следует за ней.
Это также означает, что переменная wordCount
должна быть объявлена вне оператора if
(на верхнем уровне функции).
Я думаю, fstream::open()
принимает char*
вместо строки, поэтому вы должны перекодировать его как:
inp.open (a.c_str(), std::ios::in);
Ваш вызов wordFunc()
с двумя параметрами не соответствует прототипу, у которого есть только один.
Есть некоторые посторонние переменные, такие как words
в main()
.
Последнее слово считается дважды , поскольку флаг EOF устанавливается только после того, как вы попытаетесь прочитать за пределами конца файла. Это можно исправить с помощью простого изменения оператора if
, который увеличивает wordCount
:
if ((!inp.eof()) && (word.length() > 0)) {
Со всеми этими изменениями вы получите:
#include <iostream>
#include <fstream>
unsigned long wordFunc (std::string str) {
unsigned long wordCount = 0;
std::ifstream inp;
inp.open(str.c_str(), std::ios::in);
if (inp.is_open()) {
std::string word;
while (!inp.eof()) {
inp >> word;
if ((!inp.eof()) && (word.length() > 0)) {
wordCount++;
}
}
inp.close();
}
return wordCount;
}
int main() {
std::string file;
file = "user.txt";
unsigned long a = wordFunc(file);
std::cout << "Words: " << a << std::endl;
return 0;
}