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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
Флибустьер
 Аватар для Флибустьер
0 / 0 / 0
Регистрация: 24.01.2011
Сообщений: 12
02.08.2012, 13:48     Запись и чтение вектора из файла #1
Здравствуйте! Помогите понять ошибку. Создаю группу, записываю ее в файл (первым в файл записывается непонятный символ). Первый запуск нормальный, файл создается, но при повторном группа дописывается, а вот уже на функции void ReadGroup(char *path, group&g); вылетает ошибка.

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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#include <iostream>
#include <vector>
#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <vector>
#include <fstream>
#include <iostream>
#include <algorithm>
#include <conio.h>
using namespace std;
 
struct Student
{
   char name [30], surname [30], year [10];
};
 
ostream& operator<<(ostream& os, Student &s)
{
    os<< "\nName-" << s.name << " Surname-" << s.surname << " Year-" << s.year << '\n';
    return os;
}
istream& operator >> (istream& is, Student &s)
{
    char nam [30], surnam [30], yer [10];
    cout << "\nName-";
    is >> nam; 
    cout << "Surame-";
    is >> surnam;
    cout << "Year-";
    is >> yer;
    cout << '\n';
    strcpy_s(s.name,nam);
    strcpy_s(s.surname,surnam);
    strcpy_s(s.year, yer);
    return is;
}
 
class group
{
    vector<Student> m;
    char names[30];
public:
    group();
    ~group() {/*del();*/}
    // Конструктор копирования
    group(Student& L)   { group  temp; temp.add(L);}
    void add(Student s) {m.push_back(s);}
    void del() { m.pop_back ();}
    void del(int pos) { m.erase(m.begin()+pos); }
    void Set (char *nam) { strcpy_s (names, nam);}
    void Sort (group&);
    void Serch(group& L, char *s2);
    void print ()
            {
                for (unsigned int i=0; i < m.size(); i++)
                    {
                        cout << "\nName " << m[i].name << "\nSurname " << m[i].surname << "\nYear "<< m[i].year << '\n'; 
                    }
            }
    int size(){return m.size();}
    Student& operator[](int pos) {return m[pos];}
        
        void WriteGroup(char *path, group&g);
        void ReadGroup(char *path, group&g);
    
};
 
void WriteGroup(char *path, group&g)
    {
        FILE *f=fopen(path, "a+"); //аналог fscanf(f, "%s", str);
        if (!f){puts("Error!"); return;}
        int N=g.size();
            fwrite(&g, sizeof(N), 1,f); 
            
        for (int i=0; i<N; i++)
            {
                fwrite (&g[i].name, sizeof(N), 1,f); fprintf(f, "\t");
                fwrite (&g[i].surname, sizeof(N), 1,f); fprintf(f, "\t");
                fwrite (&g[i].year, sizeof(N), 1,f); fprintf(f, "\n");
            }
        fclose(f);
    }
void ReadGroup(char *path, group&g)
    {
        FILE *f=fopen(path, "r+"); 
        if (!f){puts("Error!"); return;}
        int N=g.size();
        
        fread(&g, sizeof(N), 1,f); //&m - адрес объектаб sizeof(N)- кол-во байтб 1 - кол-вой объектов, f-файл
        printf("Name\tSurname\tYear\n");
        for (int i=0; i<N; i++)
            {
                fread (&g[i], sizeof(N)/4, 1,f); 
                fread (&g[i].name, sizeof(N)/4, 1,f); 
                fread (&g[i].surname, sizeof(N)/4, 1,f); 
                fread (&g[i].year, sizeof(N)/4, 1,f); 
            }
        fclose(f);
 
 
    }
void main ()
{
    Student  first, first1, first2, first3;
    
    strcpy_s(first.name,"Ivanovich");
    strcpy_s(first.surname,"Ivanov");
    strcpy_s(first.year,"22");
    
    strcpy_s(first1.name,"Petr");
    strcpy_s(first1.surname,"Petrov");
    strcpy_s(first1.year,"23");
    
    strcpy_s(first2.name,"Alex");
    strcpy_s(first2.surname,"Alexeev");
    strcpy_s(first2.year,"20");
 
    group gr1;
    gr1.add(first);
    gr1.add(first1);
    gr1.add(first2);
    
    cout << gr1 << '\n';
    
    WriteGroup("E:\\Ra.txt",gr1);
    ReadGroup( "E:\\Ra.txt",gr1);
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.08.2012, 13:48     Запись и чтение вектора из файла
Посмотрите здесь:

Си, Запись и Чтение из файла. C++
C++ Запись и чтение из файла
C++ запись\чтение из файла
C++ Запись/чтение вектора в/из файла.Структуры
Запись и чтение из файла C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.08.2012, 14:23     Запись и чтение вектора из файла
Еще ссылки по теме:

C++ Запись и чтение с файла
Чтение вектора структур из файла C++
C++ Запись и чтение из файла

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

Или воспользуйтесь поиском по форуму:
Флибустьер
 Аватар для Флибустьер
0 / 0 / 0
Регистрация: 24.01.2011
Сообщений: 12
05.08.2012, 14:23  [ТС]     Запись и чтение вектора из файла #21
Цитата Сообщение от Avazart Посмотреть сообщение
C++
1
2
3
stream <<"\t"<< c.day <<"\t"<< c.month <<"\t"<< c.year
 <<"\t"<< c.areacode<<"\t"<< c.callNumber
 <<"\t"<< c.min <<"\t"<< c.sec <<"\t"<< c.payFoCall<<endl;
Avazart, я понял, видно дело было в отсутствии пробелов, без них машина не смогла считать, теперь все заработало. Еще раз Вам спасибо, это хороший опыт для меня
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Yandex
Объявления
05.08.2012, 14:23     Запись и чтение вектора из файла
Ответ Создать тему
Опции темы

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