простые функции C ++ - PullRequest
       4

простые функции C ++

2 голосов
/ 30 марта 2012

Хорошо, так что я уверен, что я делаю что-то глупое: D

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

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: \Дамп \ 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;
}

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

РЕДАКТИРОВАТЬ С помощью какого-то рода я мог закончить так:

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;
}

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

Ответы [ 3 ]

4 голосов
/ 30 марта 2012

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

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

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

        if(word.length() > 0){
            wordCount++;
        }
1 голос
/ 30 марта 2012

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;
}

Нужен код любви, для которого нужно три заголовка для трех исполняемых операторов!

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

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

std::string word;

while (in >> word)
    ++wordCount;

std::cout << "Words: " << wordCount;
1 голос
/ 30 марта 2012

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


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

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...