Использование функции getstream () в классе внутри класса - PullRequest
3 голосов
/ 15 марта 2012

Я пытаюсь загрузить строки текстового файла, содержащего слова словаря, в объект массива.Я хочу, чтобы массив содержал все слова, которые начинаются с "a", другое - для "b" ... для всех букв в алфавите.

Вот класс, который я написал для объекта массива.

    #include <iostream>
    #include <string>
    #include <fstream>

    using namespace std;

    class ArrayObj
    {
    private:

        string *list;
        int size; 

    public:


        ~ArrayObj(){ delete list;}

        void loadArray(string fileName, string letter)
        {
            ifstream myFile;
            string str = "";
            myFile.open(fileName);

            size = 0;

            while(!myFile.eof())
            {
                myFile.getline(str, 100);

                if (str.at(0) == letter.at(0))
                    size++;
            }
            size -= 1; 

            list = new string[size];

            int i = 0;
            while(!myFile.eof())
            {
                myFile.getline(str, 100);

                if(str.at(0) == letter.at(0))
                {
                    list[i] = str;
                    i++;
                }
            }

            myFile.close();
        }


    };

Я получаю сообщение об ошибке:

2   IntelliSense: no instance of overloaded function     "std::basic_ifstream<_Elem, _Traits>::getline [with _Elem=char, _Traits=std::char_traits<char>]" matches the argument list d:\champlain\spring 2012\algorithms and data structures\weeks 8-10\map2\arrayobj.h  39

Я предполагаю, что это требует от меня перегрузки функции getline, но я не совсем уверен, как это происходит или почемунеобходимо.

Любой совет?

1 Ответ

6 голосов
/ 15 марта 2012

функция для потоков, имеющая дело с std :: string, не является функцией-членом istream, а скорее бесплатной функцией, которую используют следующим образом. (версия функции-члена имеет дело с char *).

std::string str;
std::ifstream file("file.dat");
std::getline(file, str);

Стоит отметить, что есть более безопасные способы сделать то, что вы пытаетесь сделать так:

#include <fstream>
#include <string>
#include <vector>

//typedeffing is optional, I would give it a better name
//like vector_str or something more descriptive than ArrayObj
typedef std::vector<std::string> > ArrayObj

ArrayObj load_array(const std::string file_name, char letter)
{
    std::ifstream file(file_name);
    ArrayObj lines;
    std::string str;

    while(std::getline(file, str)){
        if(str.at(0)==letter){
            lines.push_back(str);
        }
    }
    return lines;
}


int main(){
    //loads lines from a file
    ArrayObj awords=load_array("file.dat", 'a');
    ArrayObj bwords=load_array("file.dat", 'b');
    //ao.at(0); //access elements
}

не изобретай велосипед; векторы оформления заказа являются стандартными и сэкономят вам массу времени и усилий.

Последняя попытка не вводить using namespace std, что плохо по целому ряду причин, по которым я не пойду; вместо этого префиксы объектов std с std :: так, как std :: cout или std :: string.

http://en.cppreference.com/w/cpp/container/vector http://en.cppreference.com/w/cpp/string/basic_string/getline http://en.cppreference.com/w/cpp/string

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...