2012-03-30 3 views
2

ИТАК Я уверен, что им делать что-то глупое: Dпростые C++ функции

У меня есть функция:

int wordFunc(string a){ 
    std::ifstream inp; 
    inp.open(a, std::ios::in); 
    if (inp.is_open()){ 
     std::string word; 
     unsigned long wordCount = 0; 
     while(!inp.eof()){ 
      inp >> word; 
      while(word.length() > 0){ 
       wordCount++; 
      } 
      inp.close(); 
     } 
     return wordCount; 
    } 
} 

строка ввода пользователя file.txt - его набор будет C: \ Dump \ user.txt прямо сейчас

, когда я называю код:

int main(){ 
    string file; 
    int words = 0; 
    file = "C:\\Dump\\user.txt"; 

    int a = wordFunc(file, words); 
    cout << "Words: " << a << endl; 

    return 0; 
} 

на консоль просто останавливается - я havnt кодированный ничего я n C++ в течение многих лет, поэтому я определенно ржавый - любая помощь?

EDIT С помощью какой-то sould я заканчивал тем, что, как этот

unsigned long wordFunc(const std::string& a){ 
    std::ifstream inp(a); 
    system("cls"); 
    unsigned long wordCount = 0; 
    std::string word; 
    while(inp >> word) 
    { 
     wordCount++; 
    } 
    return wordCount; 
} 

Для функции - должно выложили обновление

+0

Вы уверены, что у вас есть правильный интерфейс? В основной программе вы вызываете wordFunc с двумя аргументами (файл и слово), а функция имеет только один аргумент (a). – Glenn

+0

Yea - я тоже это понял - это определенно цикл while –

+0

Это домашнее задание? – Johnsyweb

ответ

4

Ваша задача заключается в следующем:

 while(word.length() > 0){ 
      wordCount++; 
     } 

Это петли навсегда. Вероятно, вы имеете в виду

 if(word.length() > 0){ 
      wordCount++; 
     } 
+0

HA - я знал, что это было что-то redic - теперь im только подсчитывает 2 слова, но я могу определить, что это –

+0

@Hazy, это потому, что вы закрываете файл внутри цикла чтения, что означает, что читается только одна строка - что в сочетании с недоразумением относительно того, когда установлен флаг EOF, почему вы всегда получите '2' в качестве возвращаемого значения. Как только вы это исправите, есть еще несколько вещей, на которые вы, возможно, захотите посмотреть (см. Мой ответ). – paxdiablo

1

У вас здесь немало проблем.


В другой плакат прокомментировал строку:

while (word.length() > 0) 

зациклится, и вы должны изменить его на:

if (word.length() > 0) 

Вы смешиваете целые и неподписанные лонги ненадо. Переменные wordCount и a, а возвращаемое значение от wordFunc() должно быть одинаковым.


У вас есть inp.close()внутри цикл чтения, а не снаружи, где она принадлежит. Это означает, что он закроет файл после обработки первой строки.


Вы также заявление возврата внутри 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; 
} 
+0

Ницца. Но я, вероятно, вернусь к возврату int и верну '-1' при отказе открыть файл. Затем я инвертировал 'if', чтобы вы закончили с' if (! Inp.is_open()) {return -1} ', а остальная часть логики уменьшена на один уровень отступа. –

1

C++ уже имеет функции в стандартную библиотеку, чтобы сделать то, что вам нужно, поэтому вы можете просто сделать что-то вроде:

#include <fstream> 
#include <iostream> 
#include <algorithm> 
#include <iterator> 
#include <string> 

int main() { 
    std::ifstream in("user.txt"); 

    std::cout << "Words: " 
       << std::distance(std::istream_iterator<std::string>(in), 
           std::istream_iterator<std::string>()); 
    return 0; 
} 

Gotta love code, который нуждается в пяти заголовках для трех исполняемых заявлений!

Если вы настаиваете на том, считая себя, я бы что-то вроде:

std::ifstream in("user.txt"); 

std::string word; 

while (in >> word) 
    ++wordCount; 

std::cout << "Words: " << wordCount; 
+0

Thats great - спасибо! –

Смежные вопросы