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

Класс name, включающий в себя данные (имя, фамилия, отчество и номер работника). Зацикливание при чтении файла - C++

Восстановить пароль Регистрация
 
Владислаучык
0 / 0 / 0
Регистрация: 21.03.2013
Сообщений: 291
21.04.2014, 22:13     Класс name, включающий в себя данные (имя, фамилия, отчество и номер работника). Зацикливание при чтении файла #1
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
162
163
164
165
166
167
168
169
#include <iostream>
#include <string>
#include <fstream>
#include <locale.h>
using namespace std;
 
int kol[10];
int cl = 0;
 
 
class name
{
private:
    string _name;
    string fam;
    string surname;
    int number;
public:
    name();
    ~name(){};
    friend ostream &operator<<(ostream &, const name);
    friend istream &operator>>(istream &, name &);
    void filein(ofstream &, ifstream &, name );
    void filein_end(ofstream &, ifstream &, name );
    void fileout(ifstream &, name );
 
};
 
 
name::name()
{
    _name = '\0';
    fam = '\0';
    surname = '\0';
    number = 0;
}
 
ostream &operator<<(ostream &out, const name obj)
{
    out<<"Имя: "<<obj._name<<endl<<"Фамилия: "<<obj.fam<<endl<<"Отчество: "<<obj.surname<<endl<<"Номер: "<<obj.number<<endl;
    return out;
}
 
istream &operator>>(istream &in, name &obj)
{
      cout<<"Имя: ";
      in>>obj._name;
      cout<<endl<<"Фамилия: ";
      in>>obj.fam;
      cout<<endl<<endl<<"Отчество: ";
      in>>obj.surname;
      cout<<endl<<"Номер: ";
      in>>obj.number;
      return in;
    }
 
void name::filein(ofstream &ofs,ifstream &ifs, name nam)
{
    cout<<"Введите номер записи,после которой необходимо добавить новую: "<<endl;
        int j;
        cin>>j;
        if(j <= 0 || j >= cl)
        {
            cerr<<"Неверный номер записи - завершение!"<<endl;
            exit(1);
        }
        ofstream od;
        ifstream op;
        op.open("myfile.txt");
        od.open("myfile.txt");
        ifs.seekg(kol[j]);
        int o;
        while(!ifs.eof())
        {
            ifs>>nam;
            ofs<<nam<<endl;
            o = ifs.tellg();
            if(o == kol[cl] - 2)
                break;
        }
        int v = od.tellp();
        ofs.seekp(kol[j]);
        cin>>nam;
        ofs<<nam;
        int t = ofs.tellp();
        while(!op.eof())
        {
            int r=ofs.tellp();
            if(r-t == v)
                break;
            op>>nam;
            ofs<<nam<<endl;
        }
    }
 
 
int k=1;
 
void name::filein_end(ofstream &ofstr, ifstream &ifstr, name nam)
{
    kol[k]=ofstr.tellp();
    k++;
    cl++;
    ifstr.seekg(0,ios_base::end);
    cout<<"Ввод данных: "<<endl;
    cin>>nam;
    ofstr<<nam<<endl;
}
 
void name::fileout(ifstream &ifstr, name nam)
{
    for(int i = 1;i <= cl+1;i++)
    {
        cout<<kol[i]<<endl;
    }
    cout<<"Введите номер записи,которую необходимо считать из файла: "<<endl;
    int n;
    while(!(cin>>n))
    {
        cin.clear();
        while(cin.get() !='\n')
            continue;
        cout<<"Ошибка!Введите число ";
    }
    if(n < 0 || n > cl)
    {
        cerr<<"Ошибка!Вы ввели номер записи,которой не существует!"<<endl;
        exit(1);
    }
    ifstr.seekg(kol[n-1]);
    int x=ifstr.tellg();
    while(!ifstr.eof())
    {
        cout<<nam<<endl;
        x=ifstr.tellg();
        if(x == kol[n]-2)
            break;
    }
}
 
int main()
{
    setlocale(LC_ALL,"Russian");
    name obj;
    ifstream _if;
    ofstream _of;
    _of.open("myfile.txt");
    _if.open("myfile.txt");
    int k;
    cout<<"Введите количество работников: "<<endl;
    while(!(cin>>k))
    {
        cin.clear();
        while(cin.get() !='\n')
            continue;
        cout<<"Ошибка!Введите число ";
    }       
    for(int i = 0;i < k;i++)
    {
            obj.filein_end(_of, _if, obj);
    }
    obj.fileout(_if, obj);
    obj.filein(_of, _if, obj);
    obj.fileout(_if, obj);
    _if.close();
    _of.close();
    system("pause");
 
}
Задание: Создайте класс name, включающий в себя данные (имя, фамилия, отчество и номер работника). Создайте методы этого класса, осуществляющие файловый ввод/вывод данных указанного класса (с использованием ofstream и ifstream). Используйте форматирование данных (операторы << и >>). Функции чтения и записи должны быть независимыми: в них необходимо внести выражения для открытия соответствующего потока, а также чтения и записи. Функция записи может как добавлять записи в конец файла, так и в середину, после записи, соответствующей выбранному условию. Функции чтения потребуется некоторое условие выборки. +копирование в обратном порядке (пока не делал)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.04.2014, 22:13     Класс name, включающий в себя данные (имя, фамилия, отчество и номер работника). Зацикливание при чтении файла
Посмотрите здесь:

C++ Разработать класс: Student: Фамилия, Имя, Отчество, Дата рождения, Адрес, Средний бал , Факультет, Курс
C++ У меня выводит имя и фамилия, а отчество не хочет
Дана строка вида «Фамилия Имя Отчество». Получить строку вида Имя Отчество C++
При сокращении "Фамилия Имя Отчество" к "Фамилия И.О." пропадают "И.О." C++
C++ Структура "Владелец автомобиля": - фамилия, имя, отчество; - номер автомобиля; - телефон; - номер техпаспорта. Удалить элемент с заданным номером, доб
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nmcf
4326 / 3747 / 1261
Регистрация: 14.04.2014
Сообщений: 14,712
21.04.2014, 23:16     Класс name, включающий в себя данные (имя, фамилия, отчество и номер работника). Зацикливание при чтении файла #2
Что это? У тебя же не char-строки. Присваивай "".
C++
1
2
3
4
_name = '\0';
    fam = '\0';
    surname = '\0';
    number = 0;
Владислаучык
0 / 0 / 0
Регистрация: 21.03.2013
Сообщений: 291
21.04.2014, 23:21  [ТС]     Класс name, включающий в себя данные (имя, фамилия, отчество и номер работника). Зацикливание при чтении файла #3
ничего не изменилось
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.04.2014, 06:08     Класс name, включающий в себя данные (имя, фамилия, отчество и номер работника). Зацикливание при чтении файла #4
Где здесь чтение из файла?
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
void name::fileout(ifstream &ifstr, name nam)
{
    for(int i = 1;i <= cl+1;i++)
    {
        cout<<kol[i]<<endl;
    }
    cout<<"Введите номер записи,которую необходимо считать из файла: "<<endl;
    int n;
    while(!(cin>>n))
    {
        cin.clear();
        while(cin.get() !='\n')
            continue;
        cout<<"Ошибка!Введите число ";
    }
    if(n < 0 || n > cl)
    {
        cerr<<"Ошибка!Вы ввели номер записи,которой не существует!"<<endl;
        exit(1);
    }
    ifstr.seekg(kol[n-1]);
    int x=ifstr.tellg();
    while(!ifstr.eof())
    {
        cout<<nam<<endl;
        x=ifstr.tellg();
        if(x == kol[n]-2)
            break;
    }
}
Добавлено через 11 минут
И учитывайте, что записываете вы в файл строки (Имя: Владислаучык), а читаете слова, до пробела (in>>obj._name, в name будет "Имя:").
Владислаучык
0 / 0 / 0
Регистрация: 21.03.2013
Сообщений: 291
22.04.2014, 17:37  [ТС]     Класс name, включающий в себя данные (имя, фамилия, отчество и номер работника). Зацикливание при чтении файла #5
C++
1
2
3
4
5
6
7
 while(!ifstr.eof())
    {
        cout<<nam<<endl;
        x=ifstr.tellg();
        if(x == kol[n]-2)
            break;
    }
Но читает то что в конструкторе проиницилизировал, и в проге ещё одна ошика есть, придобавлении после позиции, весь файл стирается, и первый идёт то что в конструкторе по умолчанию, после него то что добавил
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.04.2014, 17:49     Класс name, включающий в себя данные (имя, фамилия, отчество и номер работника). Зацикливание при чтении файла #6
В какой строке находится чтение из файла? Саму строку (одну, где поток читает из файла) привидите.

Цитата Сообщение от Владислаучык Посмотреть сообщение
Но читает то что в конструкторе проиницилизировал, и в проге ещё одна ошика есть, придобавлении после позиции, весь файл стирается, и первый идёт то что в конструкторе по умолчанию, после него то что добавил
Это можно понять?
Владислаучык
0 / 0 / 0
Регистрация: 21.03.2013
Сообщений: 291
22.04.2014, 21:51  [ТС]     Класс name, включающий в себя данные (имя, фамилия, отчество и номер работника). Зацикливание при чтении файла #7
C++
1
2
3
4
5
6
7
name::name()
{
    _name = "";
    fam = "";
    surname = "";  // читает то, что в этом конструкторе
    number = 21;
}
C++
1
2
3
4
5
6
7
 while(!ifstr.eof())
    {
        cout<<nam<<endl;  // вот тут должно читать
        x=ifstr.tellg();
        if(x == kol[n]-2)
            break;
    }
C++
1
2
3
//obj.fileout(_if, obj); // выдаёт бесконечный цикл, и выводит на экран то что проинициализировано в конструкторе по умолчанию
    obj.filein(_of, _if, obj); // когда выбираю позицию на после которой нужно записать, стирается весь файл, перед этой записью появляется запись которая проиницилизирована в конструкторе по умолчанию   
    obj.fileout(_if, obj);
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.04.2014, 23:05     Класс name, включающий в себя данные (имя, фамилия, отчество и номер работника). Зацикливание при чтении файла #8
Цитата Сообщение от Владислаучык Посмотреть сообщение
cout<<nam<<endl; *// вот тут должно читать
Это вывод на консоль, а не чтение из файла. У вас поток, открытый для чтения из файла, который передаётся в эту функцию, называется ifstr.
void name::fileout(ifstream& ifstr, name nam)
{...
Владислаучык
0 / 0 / 0
Регистрация: 21.03.2013
Сообщений: 291
22.04.2014, 23:15  [ТС]     Класс name, включающий в себя данные (имя, фамилия, отчество и номер работника). Зацикливание при чтении файла #9
ifstr<<nam<<endl; - отсутствует оператор соответствующий этим операндам
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.04.2014, 00:25     Класс name, включающий в себя данные (имя, фамилия, отчество и номер работника). Зацикливание при чтении файла #10
Цитата Сообщение от Владислаучык Посмотреть сообщение
ifstr<<nam<<endl; - отсутствует оператор соответствующий этим операндам
Операторы записи от операторов чтения отличаете?
Владислаучык
0 / 0 / 0
Регистрация: 21.03.2013
Сообщений: 291
23.04.2014, 10:07  [ТС]     Класс name, включающий в себя данные (имя, фамилия, отчество и номер работника). Зацикливание при чтении файла #11
да отличил, всё ровно толку никакого
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.04.2014, 10:19     Класс name, включающий в себя данные (имя, фамилия, отчество и номер работника). Зацикливание при чтении файла #12
Цитата Сообщение от Владислаучык Посмотреть сообщение
отличил
Не заметно.
Владислаучык
0 / 0 / 0
Регистрация: 21.03.2013
Сообщений: 291
23.04.2014, 12:06  [ТС]     Класс name, включающий в себя данные (имя, фамилия, отчество и номер работника). Зацикливание при чтении файла #13
C++
1
2
3
4
5
6
7
8
9
 while(!ifstr.eof())
    {
        ifstr>>nam;  
        cout<<nam;
        x=ifstr.tellg();
        if(x == kol[n]-2)
            break;
    }
}
такой же бесконечный цикл
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.04.2014, 12:18     Класс name, включающий в себя данные (имя, фамилия, отчество и номер работника). Зацикливание при чтении файла #14
Цитата Сообщение от Владислаучык Посмотреть сообщение
такой же бесконечный цикл
Не такой же. Как может быть таким же, если вообще чтения не было?
Вот эту хрень уберите:
C++
1
2
3
x=ifstr.tellg();
        if(x == kol[n]-2)
            break;
и будет уже не бесконечным. Разбирайтесь с тем, что понавыдумывали с kol.
Владислаучык
0 / 0 / 0
Регистрация: 21.03.2013
Сообщений: 291
23.04.2014, 12:35  [ТС]     Класс name, включающий в себя данные (имя, фамилия, отчество и номер работника). Зацикливание при чтении файла #15
C++
1
2
3
4
5
6
7
8
  while(!ifstr.eof())
    {
    ifstr>>nam;  // вот тут должно читать
        cout<<nam;
    //  x=ifstr.tellg();
    //  if(x == kol[n]-2)
            break;
    }
- так по несколько раз выскакивает имя фамилия, и данные не напротив нужных строчек

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
#include <iostream>
#include <string>
#include <fstream>
#include <locale.h>
using namespace std;
 
class name
{
private:
    string _name;
    string fam;
    string surname;
    int number;
public:
    name();
    ~name(){};
    friend ostream &operator<<(ostream &, const name);
    friend istream &operator>>(istream &, name &);
//  void filein(ofstream &, ifstream &, name );
//  void filein_end(ofstream &, ifstream &, name );
//  void fileout(ifstream &, name );
    void filein(name q)
    {
    /*  int t;
        cout<<"Kol-vo zapis";
        cin>>t;*/
        ofstream of;
        of.open("file.txt");
    }
    void fileout()
    {
 
    }
};
 
name::name()
{
    _name = "";
    fam = "";
    surname = "";  // читает то, что в этом конструкторе
    number = 21;
}
 
ostream &operator<<(ostream &out, const name obj)
{
    name p;
    cout<<endl;
    out<<"Имя: "<<obj._name<<endl<<"Фамилия: "<<obj.fam<<endl<<"Отчество: "<<obj.surname<<endl<<"Номер: "<<obj.number<<endl;
    return out;
}
 
istream &operator>>(istream &in, name &obj)
{
      cout<<"Имя: ";
      in>>obj._name;
      cout<<endl<<"Фамилия: ";
      in>>obj.fam;
      cout<<endl<<endl<<"Отчество: ";
      in>>obj.surname;
      cout<<endl<<"Номер: ";
      in>>obj.number;
      return in;
}
 
 
int main()
{
    int k=0;
    int cl=0;
        setlocale(LC_ALL, "RUS");
        name obj;
        ifstream *fs;       
        int kol[10];
        ofstream _ofs("myfile.txt", ios_base::out);
        ifstream f("myfile.txt");
        //ifstream &ff=f;
        //_ofs.close();
        cout<< "Введите количество работников: ";
            while(true) {
        try {
            cin >> k;
            cin.clear();
            _flushall();
            if (cin.fail() || k <= 0) throw "Ошибка ввода данных. ";
            else break;
        }
        catch(const char *s) {
            cout << s;
            cout << "Введите количество работников - ";
        }
    }
            for(int i=0; i<k; i++)
            {
                //cout<<obj;
                cin>>obj;
                _ofs<<obj;;
                kol[i]=_ofs.tellp();
                cl++;
            }
            _ofs.close();
            f.open("myfile.txt", ios_base::in);
            int n;
            cout<<"Введите номер записи, которую необходимо считать из файла: ";
            cin>>n;
            //f.seekg(k[n-1]);
            //int x=ov.tellg();
            f.seekg((kol[n-1]));
        //  int x=f.tellg();
            while(!f.eof())
            {
                //name ob;
                cout<<endl;
                f>>obj;
                cout<<obj<<endl;
                f.close();
                break;
            }
            system("pause");
}
- я вот тут заново попробовал сделать с записью и чтением в мэине, читает всегда только последнюю запись, даже без seekg, можете плз помочь сделать чтобы читало определённую запись, и вставку в середину файла?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.04.2014, 12:39     Класс name, включающий в себя данные (имя, фамилия, отчество и номер работника). Зацикливание при чтении файла #16
Цитата Сообщение от Владислаучык Посмотреть сообщение
так по несколько раз выскакивает имя фамилия, и данные не напротив нужных строчек
Я и не говорил, что правильно будет работать. Я сказал, что цикл:
Цитата Сообщение от alsav22 Посмотреть сообщение
будет уже не бесконечным.
Добавлено через 1 минуту
Цитата Сообщение от Владислаучык Посмотреть сообщение
можете плз помочь сделать чтобы читало определённую запись, и вставку в середину файла?
Времени нет.
Владислаучык
0 / 0 / 0
Регистрация: 21.03.2013
Сообщений: 291
23.04.2014, 12:53  [ТС]     Класс name, включающий в себя данные (имя, фамилия, отчество и номер работника). Зацикливание при чтении файла #17
А знаешь примерно почему может только последнюю запись всегда читать?, вроде делал всё по образцу
Как сделать чтобы всё хотя бы прочитало?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.04.2014, 13:14     Класс name, включающий в себя данные (имя, фамилия, отчество и номер работника). Зацикливание при чтении файла #18
Цитата Сообщение от Владислаучык Посмотреть сообщение
Как сделать чтобы всё хотя бы прочитало?
Читайте в конце 4 поста. Оператор чтения по другому нужно переопределять.
C++
1
2
3
4
5
6
7
8
9
while(!f.eof())
            {
                //name ob;
                cout<<endl;
                f>>obj;
                cout<<obj<<endl;
                f.close(); // !!! зачем это?
                break; // !!! зачем это?
            }
Владислаучык
0 / 0 / 0
Регистрация: 21.03.2013
Сообщений: 291
23.04.2014, 13:22  [ТС]     Класс name, включающий в себя данные (имя, фамилия, отчество и номер работника). Зацикливание при чтении файла #19
чтобы цикла небыло бесконечного
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.04.2014, 16:31     Класс name, включающий в себя данные (имя, фамилия, отчество и номер работника). Зацикливание при чтении файла
Еще ссылки по теме:

Зацикливание при чтении из файла C++
В структуре хранятся следующие данные об учениках: фамилия, имя, отчество, рост, масса. Создать массив стру C++
Структура «Школьник»: фамилия, имя, отчество; класс; номер телефона; оценки по предметам C++

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.04.2014, 16:31     Класс name, включающий в себя данные (имя, фамилия, отчество и номер работника). Зацикливание при чтении файла #20
Для начала, сделайте перегрузку записи в файл вот так (в файле должны быть только данные, остальное добавляется при выводе):
C++
1
2
3
4
5
ofstream &operator<<(ofstream &fout, const name obj)
{
    fout << obj._name << endl  << obj.fam << endl <<  obj.surname << endl << obj.number<< endl;
    return fout;
}
Добавлено через 6 минут
Оператор чтения из файла (слова состоят из одного слова):
C++
1
2
3
4
5
6
7
8
ifstream &operator>>(ifstream &fin, name &obj)
{
     fin >> obj._name;
     fin >> obj.fam;
     fin >> obj.surname;
     fin >> obj.number;
     return fin;
}
Добавлено через 8 минут
Чтение с консоли и вывод на косоль:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
istream &operator>>(istream &in, name &obj)
{
      cout << "Имя: ";
      in >> obj._name;
      cout << "Фамилия: ";
      in >> obj.fam;
      cout << "Отчество: ";
      in >> obj.surname;
      cout << "Номер: ";
      in >> obj.number;
      cout << endl;
      return in;
}
 
ostream &operator<<(ostream &out, const name obj)
{
     out << "Имя: "      << obj._name   << endl;
     out << "Фамилия: "  << obj.fam     << endl;
     out << "Отчество: " << obj.surname << endl;
     out << "Номер: "    << obj.number  << endl;
     return out;
}
Добавлено через 2 минуты
Тогда, запись в файл (трёх объектов) и чтение из файла, с выводом на консоль, вот таким будет:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    ofstream fout("myfile.txt");
    name obj;
    for (int i = 0; i < 3; ++i)
    {
        cin >> obj;
        fout << obj;
    }
    fout.close();
    
    ifstream fin("myfile.txt");
    if (!fin)
        cout << "Error!" << endl;
    else
    {
        name obj;
        while(fin >> obj)
        {
           cout << obj << endl;
        }
        fin.close();
    }
Yandex
Объявления
23.04.2014, 16:31     Класс name, включающий в себя данные (имя, фамилия, отчество и номер работника). Зацикливание при чтении файла
Ответ Создать тему
Опции темы

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