Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
3 / 3 / 7
Регистрация: 21.03.2013
Сообщений: 644

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

21.04.2014, 22:13. Показов 2679. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
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). Используйте форматирование данных (операторы << и >>). Функции чтения и записи должны быть независимыми: в них необходимо внести выражения для открытия соответствующего потока, а также чтения и записи. Функция записи может как добавлять записи в конец файла, так и в середину, после записи, соответствующей выбранному условию. Функции чтения потребуется некоторое условие выборки. +копирование в обратном порядке (пока не делал)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.04.2014, 22:13
Ответы с готовыми решениями:

Класс Абонент: Идентификационный номер, Фамилия, Имя, Отчество, Адрес, Номер кредитной карточки
Доброго времени суток. Помогите пожалуйста написать программу. Класс Абонент: Идентификационный номер, Фамилия, Имя, Отчество, Адрес,...

Класс Покупатель: Фамилия, Имя, Отчество, Адрес, Номер кредитной карточки
Здравствуйте. Помогите пожалуйста написать программу. Я новичек и ООП даётся крайне сложно. Класс Покупатель: Фамилия, Имя, Отчество,...

Структура «Школьник»: фамилия, имя, отчество; класс; номер телефона; оценки по предметам
Структура «Школьник»: фамилия, имя, отчество; класс; номер телефона; оценки по предметам (математика, физика, русский язык,...

19
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
21.04.2014, 23:16
Что это? У тебя же не char-строки. Присваивай "".
C++
1
2
3
4
_name = '\0';
    fam = '\0';
    surname = '\0';
    number = 0;
0
3 / 3 / 7
Регистрация: 21.03.2013
Сообщений: 644
21.04.2014, 23:21  [ТС]
ничего не изменилось
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
22.04.2014, 06:08
Где здесь чтение из файла?
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 будет "Имя:").
1
3 / 3 / 7
Регистрация: 21.03.2013
Сообщений: 644
22.04.2014, 17:37  [ТС]
C++
1
2
3
4
5
6
7
 while(!ifstr.eof())
    {
        cout<<nam<<endl;
        x=ifstr.tellg();
        if(x == kol[n]-2)
            break;
    }
Но читает то что в конструкторе проиницилизировал, и в проге ещё одна ошика есть, придобавлении после позиции, весь файл стирается, и первый идёт то что в конструкторе по умолчанию, после него то что добавил
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
22.04.2014, 17:49
В какой строке находится чтение из файла? Саму строку (одну, где поток читает из файла) привидите.

Цитата Сообщение от Владислаучык Посмотреть сообщение
Но читает то что в конструкторе проиницилизировал, и в проге ещё одна ошика есть, придобавлении после позиции, весь файл стирается, и первый идёт то что в конструкторе по умолчанию, после него то что добавил
Это можно понять?
1
3 / 3 / 7
Регистрация: 21.03.2013
Сообщений: 644
22.04.2014, 21:51  [ТС]
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);
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
22.04.2014, 23:05
Цитата Сообщение от Владислаучык Посмотреть сообщение
cout<<nam<<endl; *// вот тут должно читать
Это вывод на консоль, а не чтение из файла. У вас поток, открытый для чтения из файла, который передаётся в эту функцию, называется ifstr.
void name::fileout(ifstream& ifstr, name nam)
{...
1
3 / 3 / 7
Регистрация: 21.03.2013
Сообщений: 644
22.04.2014, 23:15  [ТС]
ifstr<<nam<<endl; - отсутствует оператор соответствующий этим операндам
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
23.04.2014, 00:25
Цитата Сообщение от Владислаучык Посмотреть сообщение
ifstr<<nam<<endl; - отсутствует оператор соответствующий этим операндам
Операторы записи от операторов чтения отличаете?
1
3 / 3 / 7
Регистрация: 21.03.2013
Сообщений: 644
23.04.2014, 10:07  [ТС]
да отличил, всё ровно толку никакого
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
23.04.2014, 10:19
Цитата Сообщение от Владислаучык Посмотреть сообщение
отличил
Не заметно.
1
3 / 3 / 7
Регистрация: 21.03.2013
Сообщений: 644
23.04.2014, 12:06  [ТС]
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;
    }
}
такой же бесконечный цикл
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
23.04.2014, 12:18
Цитата Сообщение от Владислаучык Посмотреть сообщение
такой же бесконечный цикл
Не такой же. Как может быть таким же, если вообще чтения не было?
Вот эту хрень уберите:
C++
1
2
3
x=ifstr.tellg();
        if(x == kol[n]-2)
            break;
и будет уже не бесконечным. Разбирайтесь с тем, что понавыдумывали с kol.
1
3 / 3 / 7
Регистрация: 21.03.2013
Сообщений: 644
23.04.2014, 12:35  [ТС]
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, можете плз помочь сделать чтобы читало определённую запись, и вставку в середину файла?
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
23.04.2014, 12:39
Цитата Сообщение от Владислаучык Посмотреть сообщение
так по несколько раз выскакивает имя фамилия, и данные не напротив нужных строчек
Я и не говорил, что правильно будет работать. Я сказал, что цикл:
Цитата Сообщение от alsav22 Посмотреть сообщение
будет уже не бесконечным.
Добавлено через 1 минуту
Цитата Сообщение от Владислаучык Посмотреть сообщение
можете плз помочь сделать чтобы читало определённую запись, и вставку в середину файла?
Времени нет.
1
3 / 3 / 7
Регистрация: 21.03.2013
Сообщений: 644
23.04.2014, 12:53  [ТС]
А знаешь примерно почему может только последнюю запись всегда читать?, вроде делал всё по образцу
Как сделать чтобы всё хотя бы прочитало?
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
23.04.2014, 13:14
Цитата Сообщение от Владислаучык Посмотреть сообщение
Как сделать чтобы всё хотя бы прочитало?
Читайте в конце 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; // !!! зачем это?
            }
1
3 / 3 / 7
Регистрация: 21.03.2013
Сообщений: 644
23.04.2014, 13:22  [ТС]
чтобы цикла небыло бесконечного
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
23.04.2014, 16:31
Для начала, сделайте перегрузку записи в файл вот так (в файле должны быть только данные, остальное добавляется при выводе):
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();
    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.04.2014, 16:31
Помогаю со студенческими работами здесь

Customer: Фамилия, Имя, Отчество, Адрес, Телефон, Номер кредитной карточки, Номер банковского счета. Создать массив объ
Customer: Фамилия, Имя, Отчество, Адрес, Телефон, Номер кредитной карточки, Номер банковского счета. Создать массив объектов. Вывести:...

С клавиатуры вводится строка "Фамилия Имя Отчество". Изменить вывод строки на "Имя Отчество Фамилия"
С клавиатуры вводится строка &quot;Фамилия Имя Отчество&quot;. Изменить вывод строки на &quot;Имя Отчество Фамилия&quot;.

Класс студент с полями: год рождения, имя, фамилия, отчество, адрес и телефон.
Написать класс студент с полями: год рождения, имя, фамилия, отчество, адрес и телефон.

Данные должны быть размещены в следующем порядке: Ваше имя, отчество, фамилия
последовательность содержит Ваша фамилия, имя, отчество. Превратить ее таким образом, чтобы сначала данные были размещены в следующем...

Строку в формате "фамилия, имя, отчество" преобразовать в формат "имя, отчество, фамилия"
последовательность содержит Ваша фамилия, имя, отчество. Превратить ее таким образом, чтобы сначала данные были размещены в следующем...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru