W zadaniu program, wczytuje dane wejściowe z klawiatury do wektora obiektów klasy string, zapisuje treść tych łańcuchów (a nie obiekty) w pliku, a następnie kopiuje zawartość z powrotem do wektora obiektów klasy string.
Plik jest otwierany w trybie binarnym i że w zamierzeniu operacje wejścia-wyjścia powinny być realizowane za pomocą funkcji read() i write(). W zadaniu trzeba było zdefiniować:
Poniżej kod programu, jak narazie pojawiają się 2 błędy o podobnej treści związane z inicjalizacją obiektu Store, obiektem ofstream , fragment błędu to : element funkcji nie może być przywołany - jest to usunięta funkcja.
Związane jest to z inicjalizacją obiektu przez konstruktor opisany powyżej. Nie mam pojęcia jak to poprawnie zrobić.
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <fstream>
#include <cstring>
void ShowStr(const std::string & str);
void GetStrs(const std::ifstream & f, std::vector<std::string> & vec);
class Store
{
private:
std::ofstream file;
public:
Store(std::ofstream & f)
: file(f) {}
/*Store(const Store & st)
{
file = st.file;
}*/
~Store()
{
file.close();
}
void operator()(const std::string & str)
{
size_t len = str.size();
file.write((char *)&len, sizeof(std::size_t));
file.write(str.data(), len);
}
};
int main()
{
using namespace std;
vector<string> vostr;
string temp;
//pobierz łańcuchy
cout << "Podaj lancuchy (aby zakonczyc, wprowadz pusty wiersz):\n";
while (getline(cin, temp) && temp[0] != '\0')
vostr.push_back(temp);
cout << "Oto twoje dane wejsciowe.\n";
for_each(vostr.begin(), vostr.end(), ShowStr);
//zapisz w pliku
ofstream fout("lancuchy.dat", ios_base::out | ios_base::binary);
for_each(vostr.begin(), vostr.end(), Store(fout));
fout.close();
//odczytaj zawartość pliku
vector<string> vistr;
ifstream fin("lancuchy.dat", ios_base::in | ios_base::binary);
if (!fin.is_open())
{
cerr << "Nie mozna otworzyc pliku do odczytu.\n";
exit(EXIT_FAILURE);
}
GetStrs(fin, vistr);
cout << "Oto lancuchy odczytane z pliku:\n";
for_each(vistr.begin(), vistr.end(), ShowStr);
system("PAUSE");
return 0;
}
void ShowStr(const std::string & str)
{
std::cout << str << std::endl;
}
void GetStrs(std::ifstream & f, std::vector<std::string> & vec)
{
int len;
std::string str;
f.read((char *)&len, sizeof(std::size_t));
len = vec.size();
while (f.read((char *)&str, len))
{
vec.push_back(str);
}
}