De functie fstream getline() gebruiken binnen een klasse

Ik probeer regels van een tekstbestand met woordenboekwoorden in een array-object te laden. Ik wil een array met alle woorden die beginnen met “a”, een andere voor “b” … voor alle letters van het alfabet.

Hier is de klasse die ik heb geschreven voor het array-object.

   #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();
        }
    };

Ik krijg een foutmelding:

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

Ik denk dat het me nodig heeft om de Getline-functie te overbelasten, maar ik ben niet helemaal zeker hoe ik kan gaan of waarom het nodig is.

Enig advies?


Antwoord 1, Autoriteit 100%

De functie voor streams die zich bezighoudt met STD :: String is geen lid van Istream, maar eerder een vrije functie die het zo wordt gebruikt. (De versie van de lidfunctie behandelt Char *).

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

Het is vermeldenswaard. Er zijn betere veilige manieren om te doen wat u probeert te doen, dus:

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

Vind het wiel niet opnieuw uit; Checkout vectoren die ze standaard zijn en zullen u veel tijd en pijn besparen.

Eind Probeer niet in te zetten using namespace stdDAT SLECHT is voor een hele reeks redenen waar ik niet naartoe ga; In plaats daarvan Prefix Std-objecten met STD :: So Like Std :: Cout of 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

Other episodes