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

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

21.04.2014, 22:13. Показов 2126. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.04.2014, 22:13
Ответы с готовыми решениями:

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

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

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

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

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

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

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

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

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

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


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

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

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