Форум программистов, компьютерный форум CyberForum.ru

Запись в файл вектора - C++

Восстановить пароль Регистрация
 
m1ster
1 / 1 / 0
Регистрация: 21.12.2011
Сообщений: 55
14.12.2012, 22:22     Запись в файл вектора #1
можете подсказать как записать вектор структур в файл
например
есть vector<game>gamelist
game это структура с полями
int data;
string oppon;
int countplayers;

и также вопрос как обратно потом считать из файла
двоичный файл
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
14.12.2012, 23:04     Запись в файл вектора #2
способов масса.
можно например так.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
struct game {...};
// для структуры game пишем операторы << и >>
std::ostream& operator << (std::ostream& out, const game& game)
{
  ...
  return out;
}
std::istream& operator >> (std::istream& in, game& game)
{
  ...
  return in;
}
 
 
в коде:
 
{
  std::vector<game> games;
  ... заполняем вектор
  std::ofstream ofs("data.txt"); // нужные флажочки, бинарный не бинарный и т.п.
  для каждого элемента вектора позвать
  ofs << games[i];
}
 
{
  std::vector<game> games;
  std::ifstream ifs("data.txt"); // нужные флажочки, бинарный не бинарный и т.п.
  пока не дошли до конца стрима, вызываем оператор >>
  while (ifs) // ну или тут какая-то другая проверка должна быть на конец стрима
  {
     game g;
     ifs >> g;
     games.push_back(g);
  }
}
 
можно пользовать спец алгоритмы и не писать циклы вручную,
но с циклами вам будет наверно понятнее.
m1ster
1 / 1 / 0
Регистрация: 21.12.2011
Сообщений: 55
14.12.2012, 23:52  [ТС]     Запись в файл вектора #3
C++
1
ofs<<games[i];
вот этой строчкой мы записываем в файл структуру?
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4927 / 2670 / 243
Регистрация: 29.11.2010
Сообщений: 7,429
14.12.2012, 23:57     Запись в файл вектора #4
лучше всего - перегрузить оператор << и >> для структуры, а потом
C++
1
std::copy(v.begin(), v.end(), std::ostream_iterator<type> (std::cout, " "));
m1ster
1 / 1 / 0
Регистрация: 21.12.2011
Сообщений: 55
15.12.2012, 00:32  [ТС]     Запись в файл вектора #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
 
struct game{
    game(int d,string o):data(d),opon(o){}
    int data;
    string opon;
    friend ostream& operator << (std::ostream& out, const game& game){
        out<<game.data<<" "<<game.opon<<endl;
    return out;
    }
    friend istream& operator >> (std::istream& in, game& game){
    int dat;
    string oppon;
    in>>dat;
    in>>oppon;
    game.data=dat;
    game.opon=oppon;
        return in;
    }
 
};
 
int main()
{
 
    vector<game>gamelist;
    int s=2;
    int k=3;
    int n=0;
    string ss="GYY";
    string kk="MADI";
    game g1(s,ss);
    game g2(k,kk);
    gamelist.push_back(g1);
    gamelist.push_back(g2);
    n=gamelist.size();
    ofstream ofs("c://test.txt",ios::binary|ios::out);
    for(int i=0;i<n;n++){
        ofs<<gamelist[i];
    }
 
    ifstream ifs("c://data.txt",ios::binary|ios::in);
  while (ifs)
  {
     game g1(s,ss);
     ifs >> g1;
        cout<<g1;
     gamelist.push_back(g1);
  }
 
}
что-то не получилось,можете посмотреть правильно ли я делаю
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4927 / 2670 / 243
Регистрация: 29.11.2010
Сообщений: 7,429
15.12.2012, 00:49     Запись в файл вектора #6
for(int i=0;i<n;i++){
igorrr37
 Аватар для igorrr37
1594 / 1222 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 7
15.12.2012, 01:22     Запись в файл вектора #7
с помощью готовой библиотеки
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <iostream>
#include <string>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/serialization/vector.hpp>
#include <clocale>
#include <stdexcept>
#include <fstream>
#include <vector>
namespace ba = boost::archive;
 
struct Game
{
    int data;
    std::string opponent;
    int countplayers;
    template<typename Archive>
    void serialize(Archive& ar, unsigned const version)
    {
        ar & data;
        ar & opponent;
        ar & countplayers;
    }
};
 
std::ostream& operator<<(std::ostream& ost, Game const& g)
{
    return ost << g.data << '\n' << g.opponent << '\n' << g.countplayers;
}
 
int main ()
{
    setlocale(LC_ALL, "rus");
    try
    {
        std::vector<Game> v{{1, "op1", 10}, {2, "op2", 20}, {3, "op3", 30}}, vres;
        std::string sfilename("out.bin");
        std::fstream fs(sfilename.c_str(), std::ios::binary | std::ios::out);
        if(!fs.is_open())
            throw std::runtime_error("Unable to open output file");
        ba::binary_oarchive boa(fs);
        boa << v;
        fs.clear();
        fs.close();
        fs.open(sfilename.c_str(), std::ios::binary | std::ios::in);
        if(!fs.is_open())
            throw std::runtime_error("Unable to open input file");
        ba::binary_iarchive bia(fs);
        bia >> vres;
        fs.close();
        for(auto const& val : vres)
            std::cout << val << "\n\n";
    }
    catch(std::exception const& e)
    {
        std::cerr << "Exception: " << e.what() << std::endl;
    }
    return 0;
}
Миниатюры
Запись в файл вектора  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.12.2012, 19:18     Запись в файл вектора
Еще ссылки по теме:

Запись вектора строк в массив указателей на тип char C++
Запись вектора в файл C++
C++ Запись вектора в бинарный файл.

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
m1ster
1 / 1 / 0
Регистрация: 21.12.2011
Сообщений: 55
15.12.2012, 19:18  [ТС]     Запись в файл вектора #8
C++
1
2
3
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/serialization/vector.hpp>
C++
1
namespace ba = boost::archive;
это подчеркивает и пишет не удается открыть источник файл
также подчеркивает скорее всего из-за этого ba,boa,bia
Yandex
Объявления
15.12.2012, 19:18     Запись в файл вектора
Ответ Создать тему
Опции темы

Текущее время: 13:09. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru