3 / 3 / 3
Регистрация: 03.11.2014
Сообщений: 80
1

Перегрузка оператора <<

29.05.2015, 04:01. Показов 1635. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. В общем задача состоит в том, чтобы перегрузить операторы >> и << для чтения/записи в файл. Если идет (a,b) - считываем, если что-то другое - пропускаем в файле. Проблема в том, что не могу даже просто записать что-то в файл, помогите пожалуйста. Код для лучшего понимания:
Name_and_adress.h
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
#pragma once
#include <iostream>
#include <string>
#include <fstream>
#include <fstream>
#include "vector"
using namespace std;
 
class Name_and_address
{
public:
    std::string name;
    string address;
    Name_and_address(void);
    Name_and_address(string,string);
    ~Name_and_address(void);
    friend ofstream& operator<<(ofstream& s,  vector<Name_and_address*>& vect) // в файл?
{
        cout << "File name= " << endl;
    char name[100];
    cin >> name;
    s.open(name);
    s << "try1"; // Не получается записать вот это в файл
    for (int i = 0; i < vect.size(); i++)
    {
        s << '(' <<' '<< vect[i]->name <<' '<< ',' <<' '<< vect[i]->address <<' '<< ')'<<endl;
    }
    return s;
};
 
friend ifstream& operator>>(ifstream& s, vector<Name_and_address*>& vect) // из файла?
{
    string Name = "";
    Name_and_address* z;
    string Adr = "";
    char c = 0;
    cout << "File name= " << endl;
    char file[100];
    cin >> file;
    s.open(file);
    while(s.good()){
        s >> c;
    if (c == '(')
    {
        s >> Name >> c;
        if (c == ',')
        {
            s >> Adr>>c ;
            if (c == ')')
            {
                z = new Name_and_address(Name, Adr);
                vect.push_back(z);
            }
            if (c=='(')
            {
                s.putback(c);
            }
                            
        }
        if (c=='(')
            {
                s.putback(c);
            }
    }
    }
    return s;
};
void Error(ofstream& s,Name_and_address& z);
void Write(vector<Name_and_address*>& z);
void Read(vector<Name_and_address*>& z);
};
 void menu(Name_and_address A,vector<Name_and_address* >& z);
Name_and_adress.cpp
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
#include "Name_and_address.h"
using namespace std;
Name_and_address::Name_and_address(void)
{
    name="Name";
    address="Address";
}
        
Name_and_address::Name_and_address(string S,string adr){
    name=S;
    address=adr;
}
 
 
 
Name_and_address::~Name_and_address(void)
{
}
void Name_and_address::Write(vector<Name_and_address*>&  z)
{
    ofstream fout;
    fout << z;
    for (int i = 0; i < z.size(); i++)
    {
        fout<<z[i]<<endl;
    }
    
    
}
void Name_and_address::Read(vector<Name_and_address* >& z)
{
    ifstream fin;
    fin>>z;
    cout<<endl;
    for (int i = 0; i < z.size(); i++)
    {
        cout << '(' <<' '<< z[i]->name <<' '<< ',' <<' '<< z[i]->address <<' '<< ')'<<endl;
 
    }
    cout << "fromfile\n";
    
}
void menu(Name_and_address A,vector<Name_and_address* >& z)
{
    cout<<"Make your choice :"<<endl;
    cout<<"0.Exit"<<endl;
    cout<<"1.Read"<<endl;
    cout<<"2.Write"<<endl;
    int switch_on;
    cin>> switch_on;
 
    switch (switch_on)
    {
    case 0: 
        exit(0);
    case 1:
        A.Read(z);
        break;
    case 2:
        A.Write(z);
        break;
    default:
        break;
    }
}
int main()
{
 
    vector <Name_and_address*> A;
    Name_and_address B;
    while (1)
    {
        menu(B,A);
    }
    system("PAUSE");
    return 0;
}
Посмотрите пожалуйста friend ofstream& operator<< , проблема возникает уже там
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.05.2015, 04:01
Ответы с готовыми решениями:

Перегрузка оператора []
всем доброго времени суток! помогите перегрузить оператор есть у меня класс bd, и массив объектов...

Перегрузка оператора []
Возможно ли создать два перегруженных оператора индексации, чтобы один из них возвращал l-value,...

Перегрузка оператора --
Добрый день, у меня возникла небольшая проблема. Дело в том, что display() работает нормально....

Перегрузка оператора <<
Добрый пень! подскажите как написать код для реалилизации следующего требования: SpecialPrint...

9
lss
940 / 868 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
29.05.2015, 04:30 2
Цитата Сообщение от Avgust Посмотреть сообщение
s << "try1"; // Не получается записать вот это в файл
Запись происходит. Проверять нужно после выхода из Write().

Добавлено через 5 минут
Или делать flush() в операторе <<.
0
3 / 3 / 3
Регистрация: 03.11.2014
Сообщений: 80
29.05.2015, 04:32  [ТС] 3
Цитата Сообщение от lss Посмотреть сообщение
Проверять нужно после выхода из оператора <<.
а чем отличается от проверки по завершении программы? когда выхожу из программы - проверяю файл - пусто. Даже если закомментировать все действия и циклы и оставить лишь s << "try1" - в файле пусто
0
lss
940 / 868 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
29.05.2015, 04:34 4
Цитата Сообщение от Avgust Посмотреть сообщение
а чем отличается от проверки по завершении программы? когда выхожу из программы - проверяю файл - пусто.
А у меня не пусто.
0
3 / 3 / 3
Регистрация: 03.11.2014
Сообщений: 80
29.05.2015, 04:39  [ТС] 5
А можно как-то поставить условие, видит ли он мой файл, который я ввожу? может у меня оно почему-то не видит(
0
lss
940 / 868 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
29.05.2015, 04:44 6
Лучший ответ Сообщение было отмечено Avgust как решение

Решение

Вот код для проверки записи и результат работы (скрин):
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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
#include <iostream>
#include <string>
#include <fstream>
#include <fstream>
#include "vector"
using namespace std;
 
class Name_and_address
{
public:
    std::string name;
    string address;
    Name_and_address(void);
    Name_and_address(string,string);
    ~Name_and_address(void);
    friend ofstream& operator<<(ofstream& s,  vector<Name_and_address*>& vect) // в файл?
{
        cout << "File name= " << endl;
    char name[100];
    cin >> name;
    s.open(name);
    s << "try1"; // Не получается записать вот это в файл
    //s.flush();
    /*for (int i = 0; i < vect.size(); i++)
    {
        s << '(' <<' '<< vect[i]->name <<' '<< ',' <<' '<< vect[i]->address <<' '<< ')'<<endl;
    }*/
    return s;
};
 
friend ifstream& operator>>(ifstream& s, vector<Name_and_address*>& vect) // из файла?
{
    string Name = "";
    Name_and_address* z;
    string Adr = "";
    char c = 0;
    cout << "File name= " << endl;
    char file[100];
    cin >> file;
    s.open(file);
    while(s.good()){
        s >> c;
    if (c == '(')
    {
        s >> Name >> c;
        if (c == ',')
        {
            s >> Adr>>c ;
            if (c == ')')
            {
                z = new Name_and_address(Name, Adr);
                vect.push_back(z);
            }
            if (c=='(')
            {
                s.putback(c);
            }
                            
        }
        if (c=='(')
            {
                s.putback(c);
            }
    }
    }
    return s;
};
void Error(ofstream& s,Name_and_address& z);
void Write(vector<Name_and_address*>& z);
void Read(vector<Name_and_address*>& z);
};
 void menu(Name_and_address A,vector<Name_and_address* >& z);
 
 
 Name_and_address::Name_and_address(void)
{
    name="Name";
    address="Address";
}
        
Name_and_address::Name_and_address(string S,string adr){
    name=S;
    address=adr;
}
 
 
 
Name_and_address::~Name_and_address(void)
{
}
void Name_and_address::Write(vector<Name_and_address*>&  z)
{
    ofstream fout;
    fout << z;
    /*for (int i = 0; i < z.size(); i++)
    {
        fout<<z[i]<<endl;
    }*/
    
    
}
void Name_and_address::Read(vector<Name_and_address* >& z)
{
    ifstream fin;
    cout << "File name= " << endl;
    char name[100];
    cin >> name;
    fin.open(name);
    if (fin)
    {
        fin >> name;
        cout << name << endl;
    }
    else
        cout << "Error!" << endl;
    
    /*fin>>z;
    cout<<endl;
    for (int i = 0; i < z.size(); i++)
    {
        cout << '(' <<' '<< z[i]->name <<' '<< ',' <<' '<< z[i]->address <<' '<< ')'<<endl;
 
    }
    cout << "fromfile\n";*/
    
}
void menu(Name_and_address A,vector<Name_and_address* >& z)
{
    cout<<"Make your choice :"<<endl;
    cout<<"0.Exit"<<endl;
    cout<<"1.Read"<<endl;
    cout<<"2.Write"<<endl;
    int switch_on;
    cin>> switch_on;
 
    switch (switch_on)
    {
    case 0: 
        exit(0);
    case 1:
        A.Read(z);
        break;
    case 2:
        A.Write(z);
        break;
    default:
        break;
    }
}
int main()
{
 
    vector <Name_and_address*> A;
    Name_and_address B;
    while (1)
    {
        menu(B,A);
    }
    system("PAUSE");
    return 0;
}
Миниатюры
Перегрузка оператора <<  
1
lss
940 / 868 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
29.05.2015, 04:47 7
Цитата Сообщение от Avgust Посмотреть сообщение
А можно как-то поставить условие, видит ли он мой файл, который я ввожу? может у меня оно почему-то не видит(
Это для чтения всегда проверять нужно открытие (у меня в коде посмотри как), для записи обычно не проверяется, потому что новый файл создаётся. Потом, ты пишешь, что файл пустой, значит он создаётся, значит всё видно, что вводишь.
0
3 / 3 / 3
Регистрация: 03.11.2014
Сообщений: 80
29.05.2015, 04:55  [ТС] 8
Оно выводит try1 в консоле, а как сделать, чтобы это try1 записывалось в этот файл 222.txt ?(
0
lss
940 / 868 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
29.05.2015, 05:01 9
Цитата Сообщение от Avgust Посмотреть сообщение
Оно выводит try1 в консоле, а как сделать, чтобы это try1 записывалось в этот файл 222.txt ?(
Код мой смотри, это я из файла считываю и вывожу на консоль:
Цитата Сообщение от lss Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
ifstream fin;
* * cout << "File name= " << endl;
* * char name[100];
* * cin >> name;
* * fin.open(name);
* * if (fin)
* * {
* * * * fin >> name; // читаю из файла, в который перед этим записал try1
* * * * cout << name << endl; // вывожу на консоль то, что прочитал из файла
* * }
* * else
* * * * cout << "Error!" << endl;
Всё, я спать.
0
3 / 3 / 3
Регистрация: 03.11.2014
Сообщений: 80
29.05.2015, 05:32  [ТС] 10
спасибо большое, кажется разобрался))
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.05.2015, 05:32
Помогаю со студенческими работами здесь

Перегрузка оператора +
Здравствуйте. Пытаюсь перегрузить оператор сложения, но выдаёт ошибку. Задача в том, чтобы сложить...

Перегрузка оператора =
Нужно перегрузить оператор так что бы в начале строки и в конце были квадратные скобки . Все почти...

Перегрузка оператора +
Всем добрый вечер. Прошу помочь разобраться. Задание - Для определения даты поставки строительных...

перегрузка оператора +
Не могу понять: в 184 строке отказывается работать. Без нее - все нормально. Скорее всего...

Перегрузка оператора ‘=’
Подскажите, пожалуйста, можно ли как-то перегрузить оператор равно. Чтобы можно было его...

Перегрузка оператора ~
Доброго времени суток! Помогите пожалуйста с решением задачи. Описать класс множество целых...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru