Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
Флибустьер
0 / 0 / 0
Регистрация: 24.01.2011
Сообщений: 12
#1

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

02.08.2012, 13:48. Просмотров 1315. Ответов 20
Метки нет (Все метки)

Здравствуйте! Помогите понять ошибку. Создаю группу, записываю ее в файл (первым в файл записывается непонятный символ). Первый запуск нормальный, файл создается, но при повторном группа дописывается, а вот уже на функции 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);
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.08.2012, 13:48
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Запись и чтение вектора из файла (C++):

Запись и чтение вектора из файла - C++
Здравствуйте! Вот небольшая прога которая пишет в вектор структуру... при повторном запуске она читает с файла в вектор и по идее можно...

Запись/чтение вектора в/из файла.Структуры - C++
Доброе время суток.Проблема заключается в следующем: в файл идет запись вектора (запись вроде-бы успешна,насколько я могу судить).После...

Запись вектора uin8_t в бинарный файл и обратное чтение из файла - C++
Здравствуйте. Есть std::vector&lt;uint8_t&gt;. Нужно записать все элементы в бинарный файл, а затем считать обратно из файла в...

Чтение вектора структур из файла - C++
struct TRANSACTIONS { unsigned long long sender; unsigned long long receiver; unsigned long long amount; } ... ...

Вектора и чтение из файла и обратно (File IO) - C++
Ребят! Помогите как сможете! Я никак не могу связать перечисления между собой( И еще никак не могу сделать так, чтобы каждый раз, когда...

Запись и чтение с файла - C++
Есть названия машин, их цена и производитель. Нужно сделать программу, которая при вводе производителя выводит название машины и её цены. ...

20
Флибустьер
0 / 0 / 0
Регистрация: 24.01.2011
Сообщений: 12
05.08.2012, 13:54  [ТС] #16
Выдала
size: 0

Но не обнулила файл
0
Avazart
Эксперт С++
7233 / 5429 / 303
Регистрация: 10.12.2010
Сообщений: 24,128
Записей в блоге: 17
05.08.2012, 13:56 #17
Ну ошибка здесь

C++
1
2
3
4
5
6
7
8
9
10
11
12
std::ostream &operator <<(std::ostream &stream, Call c)
{
    stream << "In date: " << c.day << '.' << c.month << '.' << c.year;
    stream << " you call in number ";
    stream << '(';
    std::cout.width(3);
    std::cout.fill('0');
    stream << c.areacode << ')' << '-' << c.callNumber << ",\nlength of call ";
    stream << c.min << "min " << c.sec << "sec. Call cast ";
    stream << c.CallCast() << '\n';
    return stream;
}
Не понятно чего вы ожидали? Как должно было это потом прочитатся?
Уберите от сюда все строки-пояснения скобки итп.
0
grizlik78
Эксперт С++
1971 / 1464 / 122
Регистрация: 29.05.2011
Сообщений: 3,029
05.08.2012, 13:57 #18
Цитата Сообщение от Флибустьер Посмотреть сообщение
Выдала
size: 0
И это не удивительно. Операторы потокового ввода и вывода друг-другу не соответствует. При выводе записывается большое количество информации, неожиданной для оператора ввода.
Тут надо определиться, должен ли выходной файл быть удобным для чтения человеку или машине.
1
Флибустьер
0 / 0 / 0
Регистрация: 24.01.2011
Сообщений: 12
05.08.2012, 14:13  [ТС] #19
Операторы ввода и вывода приведены в соответствие:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
std::ostream &operator <<(std::ostream &stream, Call c)
{
    stream << c.day << c.month << c.year;
    stream << c.areacode << c.callNumber;
    stream << c.min << c.sec ;
    stream << c.payFoCall;
    return stream;
}
 
std::istream &operator >> (std::istream &stream, Call &c)
{
    stream >> c.day >> c.month >> c.year;
    stream >> c.areacode >> c.callNumber;
    stream >> c.min >> c.sec;
    stream >> c.payFoCall;
    return stream;
}
main выглядит так:
C++
1
2
3
4
5
6
7
8
vector<Call> calls;
    ifstream ifs("Calls.txt");
 
    if(ifs)  copy(istream_iterator<Call>(ifs), istream_iterator<Call>(), back_inserter(calls));
    else cerr << "Error!!";
 
    cout<<endl<< "size:\t"<< calls.size()<<endl;
    _getch();
Файл не пустой, но при чтении данные не записываются в вектор, Error!! не выводится, size = 0... После закрытия программы файл не обнуляется
0
Avazart
Эксперт С++
7233 / 5429 / 303
Регистрация: 10.12.2010
Сообщений: 24,128
Записей в блоге: 17
05.08.2012, 14:17 #20
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
std::ostream &operator << (const std::ostream &stream,const Call& c)
{
    stream <<  c.day       << "\t"   << c.month   << "\t"    << c.year << std::endl;
    stream <<  c.areacode  << "\t"   << c.callNumber << std::endl;
    stream <<  c.min       << "\t"   << c.sec << std::endl;
    stream <<  c.payFoCall <<endl;
 
    return stream; 
}
 
std::istream &operator >> (std::istream &stream, Call &c)
{
    stream >> c.day >> c.month >> c.year;
    stream >> c.areacode >> c.callNumber;
    stream >> c.min >> c.sec;
    stream >> c.payFoCall;
 
    return stream;
}
1
Флибустьер
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, я понял, видно дело было в отсутствии пробелов, без них машина не смогла считать, теперь все заработало. Еще раз Вам спасибо, это хороший опыт для меня
0
05.08.2012, 14:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.08.2012, 14:23
Привет! Вот еще темы с ответами:

Запись и чтение с файла - C++
Здравствуйте,помогите пожалуйста ..есть две структуры, но каждая записывается и считывается с разных файлов, не посоветует как можно...

Запись и чтение из файла - C++
Доброго время суток! Так от балди решыл набросать прогу которая создаёт файл записывает туда 11 рандомных чисел,потом з помощю ifstream я...

Запись и чтение из файла - C++
Всем добрый вечер, как можно записать данные в файл? Например записать в txt файл список паролей. На одном сайте нашел информацию по...

Запись и чтение с файла - C++
Подскажите пожалуйста как правильно записать массив в файл и считать его оттуда в другой массив? Если можно пример кода не в чистом с,а...


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

Или воспользуйтесь поиском по форуму:
21
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.