vendredi 23 janvier 2015

Vectors disappear

So I am having problem with my Item::return_all() as I call it in main.cpp. Earlier I tried return_all inside read_file() and for (auto data : example_item) loop printed data inside item_ correctly. What is the reason return_all() doesn't return (or atleast main.cpp doesn't print it) data inside item_if I call it in main? Or does the data inside item_ disappear due to some reason I don't know as my c++ knowledge is pretty limited.


Items.txt contains lines in format "1001:0:6".


main.cpp

#include "item.hh"
#include "functions.hh"

int main() {
Item item;
read_file("items.txt");
std::vector<std::vector<int>> example_item = item.return_all();
for (auto data : example_item){
for (auto data2 : data){
std::cout << data2 << std::endl;
}
}
}


item.hh

class Item {

public:
Item();
void add_item(std::vector<int> item);
std::vector<std::vector<int>> return_all();
std::vector<int> return_item(const int& name) const;

private:
std::vector<std::vector<int>> item_;
};


item.cpp

#include "item.hh"
#include "functions.hh"

Item::Item(){}

void Item::add_item(std::vector<int> item){
item_.push_back(item);
}

std::vector<std::vector<int>> Item::return_all(){
return item_;
}

std::vector<int> Item::return_item(const int& name) const {
for (auto item : item_) {
if (item.at(0) == name) {
return item;
}
}
return {};
}


functions.hh

void read_file(const std::string name);
std::vector<std::string> split(const std::string& string, char splitter);


functions.cpp

#include "item.hh"
#include "functions.hh"

void read_file(const std::string name){
Item item;
std::string line;
std::ifstream myfile(name);
if (myfile.is_open())
{
while (getline(myfile, line))
{
std::vector<std::string> field{};
field = split(line, ':');
int name = std::stoi(field.at(0));
int type = std::stoi(field.at(1));
int attr = std::stoi(field.at(2));
std::vector<int> field_i = {name , type, attr};
item.add_item(field_i);
}
}
myfile.close();
}

std::vector<std::string> split(const std::string& string, char splitter) {
std::vector<std::string> fields{};
std::string::size_type start_p{0};
while ( true ) {
std::string::size_type end_p{0};
end_p = string.find(splitter, start_p);
if ( end_p == std::string::npos ) {
break;
}
std::string field{""};
field = string.substr(start_p, end_p - start_p);
fields.push_back(field);
start_p = end_p + 1;
}
fields.push_back(string.substr(start_p));
return fields;
}

Aucun commentaire:

Enregistrer un commentaire