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

Как перегрузить оператор ввода из файла? - C++

Восстановить пароль Регистрация
 
Why so seriouS
 Аватар для Why so seriouS
44 / 44 / 1
Регистрация: 12.03.2013
Сообщений: 167
14.03.2013, 16:50     Как перегрузить оператор ввода из файла? #1
Допустим у нас есть класс:
C++
1
2
3
4
5
6
class A
{friend ifstream &operator>>(ifstream &, A &);
  private:
      char a;
      char b;     
};
И как перегрузить этот оператор для него?

Добавлено через 8 минут
Так почему не работает?
C++
1
2
3
4
5
6
ifstream &operator>>(ifstream &input,A & Obj)
{
    input >> Obj.a >> Obj.b;
 
    return input;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.03.2013, 16:50     Как перегрузить оператор ввода из файла?
Посмотрите здесь:

как перегрузить оператор []? C++
C++ Как перегрузить оператор в виртуальном классе
Как перегрузить оператор = C++
C++ Как перегрузить оператор ввода?
C++ Как перегрузить оператор разыменования *
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
SummerRain
 Аватар для SummerRain
325 / 324 / 17
Регистрация: 16.12.2012
Сообщений: 544
14.03.2013, 16:59     Как перегрузить оператор ввода из файла? #2
C++
1
2
3
4
5
6
7
8
class A
{
public:
    friend std::ifstream& operator>>(std::ifstream&, A&);
private:
      char a;
      char b;     
};
Why so seriouS
 Аватар для Why so seriouS
44 / 44 / 1
Регистрация: 12.03.2013
Сообщений: 167
14.03.2013, 17:02  [ТС]     Как перегрузить оператор ввода из файла? #3
C++
1
2
3
 бинарный ">>": не найден оператор, принимающий правый операнд типа "int" (или приемлемое преобразование отсутствует)
           может быть "std::ifstream &operator >>(std::ifstream &,A &)"
          при попытке сопоставить список аргументов "(std::ifstream, int)"
SummerRain
 Аватар для SummerRain
325 / 324 / 17
Регистрация: 16.12.2012
Сообщений: 544
14.03.2013, 17:06     Как перегрузить оператор ввода из файла? #4
я не понимаю откуда взял там инт, наверно лучше сразу выложить весь код.
Вот работающий код (с файлом file.txt в папке проекта само собой)
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
#include <iostream>
#include <fstream>
 
class A
{
public:
    friend std::ifstream& operator>>(std::ifstream&, A&);
    friend std::ostream& operator << (std::ostream& os, A& a);
private:
      char a;
      char b;     
};
 
 
std::ifstream& operator>>(std::ifstream& input, A& Obj)
{
    input >> Obj.a >> Obj.b;
 
    return input;
}
 
std::ostream& operator << (std::ostream& os, A& Obj) {
    os << Obj.a << " " << Obj.b;
    return os;
}
 
int main()
{
    std::ifstream in("file.txt");
    A test;
    in >> test;
    std::cout << test;
    system("pause");
}
Why so seriouS
 Аватар для Why so seriouS
44 / 44 / 1
Регистрация: 12.03.2013
Сообщений: 167
14.03.2013, 17:09  [ТС]     Как перегрузить оператор ввода из файла? #5
Ругает вот это:
input >> Obj.tup_masage;
Вот весь код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include "oc.h"
#include <iostream>
 
using namespace std;
 
 
ifstream &operator>>(ifstream &input,OC & Obj)
{
    input >> Obj.tup_masage;
 
    return input;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#ifndef OC_H
#define OC_H
 
#include <iostream>
 
using namespace std;
 
class OC
{
public:
    friend ifstream &operator>>(ifstream &, OC &);
public:
    void Set();
    void Show();
private:
    int tup_masage;
    char servis;
    char opus;
};
 
#endif
SummerRain
 Аватар для SummerRain
325 / 324 / 17
Регистрация: 16.12.2012
Сообщений: 544
14.03.2013, 17:12     Как перегрузить оператор ввода из файла? #6
и правильно ругает, потому что надо добавить
C++
1
#include <fstream>
либо
C++
1
#include <ifstream>
Why so seriouS
 Аватар для Why so seriouS
44 / 44 / 1
Регистрация: 12.03.2013
Сообщений: 167
14.03.2013, 17:25  [ТС]     Как перегрузить оператор ввода из файла? #7
Еще вопрос: почему после выполнения этого куска кода у меня получается аж 5 объектов хотя должно быть только 4?
C++
1
2
3
4
5
while(!input.eof())
        {
            input >> tmp;
            Obj.push_back(tmp);
        }
Вот пример файла:
1
1
1
2
2
2
3
3
3
4
4
4

4 4 4 записывает почему-то два раза

Добавлено через 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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <iostream>
#include "oc.h"
#include <vector>
#include <fstream>
 
using namespace std;
 
int menu();
 
int main()
{
    vector<OC> Obj;
    OC tmp;
    ifstream input;
    while(1){
    int code = menu();
    if(code == 1){
        cout<<"Enter spisok"<<endl;
    
        int n=0;
        cin>>n;
        while(n)
        {
            tmp.Set();
            Obj.push_back(tmp);
            --n;
        }
    }
 
    if(code == 2){
        char name_file[20];
        cin>>name_file;
        input.open(name_file,ios::in);
        if(!input){
            cout<<"Error!";
            system("pause>0");
            return 1;
        }
        while(!input.eof())
        {
            input >> tmp;
            Obj.push_back(tmp);
        }
    }
 
    if(code == 3)
        for(int i=0;i<Obj.size();i++)
            Obj[i].Show();
    }
    system("pause>0");
    return 0;
}
 
int menu()
{
    cout<<"1 - Enter dani."<<endl
        <<"2 - Iz fajly."<<endl
        <<"3 - Show."<<endl;
    int key;
    cin>>key;
    return key;
}
SummerRain
 Аватар для SummerRain
325 / 324 / 17
Регистрация: 16.12.2012
Сообщений: 544
14.03.2013, 18:06     Как перегрузить оператор ввода из файла? #8
если взять этот файл, то у меня вывод:
1 1 1 2 2 2 3 3 3 4 4 4
вроде так и должно быть. Ошбики не вижу
и какие реализации методов Show(), Set()?
Why so seriouS
 Аватар для Why so seriouS
44 / 44 / 1
Регистрация: 12.03.2013
Сообщений: 167
14.03.2013, 18:10  [ТС]     Как перегрузить оператор ввода из файла? #9
А у меня выводит так же, только последний объект копирует и записывает снова.
Функции такие, но они отношения не имеют к этому.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void OC::Show()
{
    cout<<"Tup masage: "<<tup_masage<<endl
        <<"Servis: "<<servis<<endl
        <<"Opus:"<<opus<<endl;
}
 
void OC::Set()
{
    cout<<"Enter masage: "; cin>>tup_masage;
    cout<<"Enter servis: "; cin>>servis;
    cout<<"Opus: "; cin>>opus;
}
SummerRain
 Аватар для SummerRain
325 / 324 / 17
Регистрация: 16.12.2012
Сообщений: 544
14.03.2013, 18:18     Как перегрузить оператор ввода из файла? #10
смотрю и не могу понять куда и какая функция копирует последний объект и куда записывает снова?
У меня всё работает как надо.
Why so seriouS
 Аватар для Why so seriouS
44 / 44 / 1
Регистрация: 12.03.2013
Сообщений: 167
14.03.2013, 18:26  [ТС]     Как перегрузить оператор ввода из файла? #11
Вот содержимое файла:
1 1 1 2 2 2 3 3 3
Вот что мне выводит:
Как перегрузить оператор ввода из файла?
Вот код с которым работаю:
main.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
78
79
80
81
82
83
84
85
86
87
#include <iostream>
#include <vector>
#include <fstream>
#include <algorithm>
#include "oc.h"
 
using namespace std;
 
int menu();
 
 
int main()
{
    vector<OC> Obj;
    OC tmp;
    ifstream input;
    ofstream output;
    while(1){
    int code = menu();
    if(code == 1){
        cout<<"Enter spisok"<<endl;
    
        int n=0;
        cin>>n;
        while(n)
        {
            tmp.Set();
            Obj.push_back(tmp);
            --n;
        }
    }
 
    if(code == 2){
        char name_file[10];
        cout<<"Enter 1.txt";
        cin>>name_file;
        input.open(name_file,ios::in);
        if(!input){
            cout<<"Error!";
            system("pause>0");
            return 1;
        }
        while(!input.eof())
        {
            input >> tmp;
            Obj.push_back(tmp);
        }
        input.close();
    }
 
    if(code == 3)
        for(int i=0;i<Obj.size();i++)
            Obj[i].Show();
 
    if(code == 4)
        sort(Obj.begin(),Obj.end(),comp_tup);
 
    if(code == 5){
        char name_file[10];
        cin>>name_file;
        output.open(name_file,ios::out);
        if(!output){
            cout<<"Error!";
            system("pause>0");
            return 1;
        }
        for(int i=0;i<Obj.size();i++)
            output << Obj[i];
        output.close();
    }
    }
    
    system("pause>0");
    return 0;
}
 
int menu()
{
    cout<<"1 - Enter dani."<<endl
        <<"2 - Iz fajly."<<endl
        <<"3 - Show."<<endl
        <<"4 - Sort tup"<<endl
        <<"5 - Show in file"<<endl;
    int key;
    cin>>key;
    return key;
}

OC.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
#include "oc.h"
#include <iostream>
#include <vector>
 
using namespace std;
 
void OC::Show()
{
    cout<<"Tup masage: "<<tup_masage<<endl
        <<"Servis: "<<servis<<endl
        <<"Opus:"<<opus<<endl;
}
 
void OC::Set()
{
    cout<<"Enter masage: "; cin>>tup_masage;
    cout<<"Enter servis: "; cin>>servis;
    cout<<"Opus: "; cin>>opus;
}
 
ifstream &operator>>(ifstream &input,OC & Obj)
{
    input >> Obj.tup_masage ;
    input >> Obj.servis;
    input >> Obj.opus;
 
    return input;
}
 
ofstream &operator<<(ofstream &output,OC & Obj)
{
    output << Obj.tup_masage << " ";
    output << Obj.servis << " ";
    output << Obj.opus << endl;
 
    return output;
}
 
int comp_tup(OC Obj_left,OC Obj_righ)
{
    return Obj_left.tup_masage <  Obj_righ.tup_masage;
}

OC.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
#ifndef OC_H
#define OC_H
 
#include <iostream>
#include <fstream>
 
using namespace std;
 
class OC
{
public:
    friend int comp_tup(OC Obj_left,OC Obj_righ);
    friend ifstream &operator>>(ifstream &, OC &);
    friend ofstream &operator<<(ofstream &, OC &);
public:
    void Set();
    void Show();
    int getMasage(){return tup_masage;}
private:
    int tup_masage;
    char servis;
    char opus;
};
 
#endif
SummerRain
 Аватар для SummerRain
325 / 324 / 17
Регистрация: 16.12.2012
Сообщений: 544
14.03.2013, 19:21     Как перегрузить оператор ввода из файла? #12
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
#include <iostream>
#include <vector>
#include <fstream>
#include <algorithm>
#include "oc.h"
 
using namespace std;
 
int menu();
 
 
int main()
{
    vector<OC> Obj;
    OC tmp;
    ifstream input;
    ofstream output;
    while(1){
    int code = menu();
    if(code == 1){
        cout<<"Enter spisok"<<endl;
    
        int n=0;
        cin>>n;
        while(n)
        {
            tmp.Set();
            Obj.push_back(tmp);
            --n;
        }
    }
 
    if(code == 2){
        char name_file[10];
        cout<<"Enter 1.txt";
        cin>>name_file;
        input.open(name_file,ios::in);
        if(!input){
            cout<<"Error!";
            system("pause>0");
            return 1;
        }
        char ch;    // добавлено
        while((ch = input.get()) != EOF)   // изменено
        {
            input.unget();              // добавлено
            input >> tmp;
            Obj.push_back(tmp);
        }
        input.close();
    }
 
    if(code == 3)
        for(int i=0;i<Obj.size();i++)
            Obj[i].Show();
 
    if(code == 4)
        sort(Obj.begin(),Obj.end(),comp_tup);
 
    if(code == 5){
        char name_file[10];
        cin>>name_file;
        output.open(name_file,ios::out);
        if(!output){
            cout<<"Error!";
            system("pause>0");
            return 1;
        }
        for(int i=0;i<Obj.size();i++)
            output << Obj[i];
        output.close();
    }
    }
    
    system("pause>0");
    return 0;
}
 
int menu()
{
    cout<<"1 - Enter dani."<<endl
        <<"2 - Iz fajly."<<endl
        <<"3 - Show."<<endl
        <<"4 - Sort tup"<<endl
        <<"5 - Show in file"<<endl;
    int key;
    cin>>key;
    return key;
}
Why so seriouS
 Аватар для Why so seriouS
44 / 44 / 1
Регистрация: 12.03.2013
Сообщений: 167
14.03.2013, 19:24  [ТС]     Как перегрузить оператор ввода из файла? #13
SummerRain, а почему моя реализация не работала? И почему ваша работает нормально?)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.03.2013, 20:02     Как перегрузить оператор ввода из файла?
Еще ссылки по теме:

Как перегрузить оператор C++
C++ Как правильно перегрузить оператор [] =
C++ Как в классе перегрузить оператор двойного индексирование?

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

Или воспользуйтесь поиском по форуму:
SummerRain
 Аватар для SummerRain
325 / 324 / 17
Регистрация: 16.12.2012
Сообщений: 544
14.03.2013, 20:02     Как перегрузить оператор ввода из файла? #14
ну вообщем если сделать !input.eof(), то даже при пустом файле в вектор Obj будет добавляться объект содержащий абракатабру.

P.S. в заголовках лучше не использовать using-ги без необходимости. Т.к. заголовки могут подключаться ко многим проектам. И эти юзинги тоже будут там использоваться. Хотя пользователи этих заголовков могут этого не захотеть.

Добавлено через 30 минут
Флаг EOF устанавливается только после операции чтения после конца файла. Если в файле состоящем из 5 байтов мы прочитали 5, то EOF всё ещё является ложным.
Yandex
Объявления
14.03.2013, 20:02     Как перегрузить оператор ввода из файла?
Ответ Создать тему
Опции темы

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