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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Владислаучык
0 / 0 / 1
Регистрация: 21.03.2013
Сообщений: 336
#1

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

21.04.2014, 22:13. Просмотров 786. Ответов 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). Используйте форматирование данных (операторы << и >>). Функции чтения и записи должны быть независимыми: в них необходимо внести выражения для открытия соответствующего потока, а также чтения и записи. Функция записи может как добавлять записи в конец файла, так и в середину, после записи, соответствующей выбранному условию. Функции чтения потребуется некоторое условие выборки. +копирование в обратном порядке (пока не делал)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.04.2014, 22:13
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Класс name, включающий в себя данные (имя, фамилия, отчество и номер работника). Зацикливание при чтении файла (C++):

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

Разработать класс: Student: Фамилия, Имя, Отчество, Дата рождения, Адрес, Средний бал , Факультет, Курс - C++
Разработать классы для описанных ниже объектов. Включить в класс методы set (…), get (…), Определить другие методы ...

Структура "Владелец автомобиля": - фамилия, имя, отчество; - номер автомобиля; - телефон; - номер техпаспорта. Удалить элемент с заданным номером, доб - C++
Структура &quot;Владелец автомобиля&quot;: - фамилия, имя, отчество; - номер автомобиля; - телефон; - номер техпаспорта. Удалить элемент с...

Дана строка вида «Фамилия Имя Отчество». Получить строку вида Имя Отчество - C++
Дана строка вида «Фамилия Имя Отчество». Получить строку вида Имя Отчество

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

Зацикливание при чтении из файла - C++
Пытаюсь читать из файла данные,сохраненные из Экселя TempBook-&gt;SaveAs(PathFile+&quot;\\&quot;+&quot;Temp&quot;,Excel::xlCSV , &amp;vtMissing, &amp;vtMissing,...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
nmcf
5309 / 4629 / 1550
Регистрация: 14.04.2014
Сообщений: 18,437
21.04.2014, 23:16 #2
Что это? У тебя же не char-строки. Присваивай "".
C++
1
2
3
4
_name = '\0';
    fam = '\0';
    surname = '\0';
    number = 0;
Владислаучык
0 / 0 / 1
Регистрация: 21.03.2013
Сообщений: 336
21.04.2014, 23:21  [ТС] #3
ничего не изменилось
alsav22
5417 / 4813 / 442
Регистрация: 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 будет "Имя:").
Владислаучык
0 / 0 / 1
Регистрация: 21.03.2013
Сообщений: 336
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;
    }
Но читает то что в конструкторе проиницилизировал, и в проге ещё одна ошика есть, придобавлении после позиции, весь файл стирается, и первый идёт то что в конструкторе по умолчанию, после него то что добавил
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.04.2014, 17:49 #6
В какой строке находится чтение из файла? Саму строку (одну, где поток читает из файла) привидите.

Цитата Сообщение от Владислаучык Посмотреть сообщение
Но читает то что в конструкторе проиницилизировал, и в проге ещё одна ошика есть, придобавлении после позиции, весь файл стирается, и первый идёт то что в конструкторе по умолчанию, после него то что добавил
Это можно понять?
Владислаучык
0 / 0 / 1
Регистрация: 21.03.2013
Сообщений: 336
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);
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.04.2014, 23:05 #8
Цитата Сообщение от Владислаучык Посмотреть сообщение
cout<<nam<<endl; *// вот тут должно читать
Это вывод на консоль, а не чтение из файла. У вас поток, открытый для чтения из файла, который передаётся в эту функцию, называется ifstr.
void name::fileout(ifstream& ifstr, name nam)
{...
Владислаучык
0 / 0 / 1
Регистрация: 21.03.2013
Сообщений: 336
22.04.2014, 23:15  [ТС] #9
ifstr<<nam<<endl; - отсутствует оператор соответствующий этим операндам
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.04.2014, 00:25 #10
Цитата Сообщение от Владислаучык Посмотреть сообщение
ifstr<<nam<<endl; - отсутствует оператор соответствующий этим операндам
Операторы записи от операторов чтения отличаете?
Владислаучык
0 / 0 / 1
Регистрация: 21.03.2013
Сообщений: 336
23.04.2014, 10:07  [ТС] #11
да отличил, всё ровно толку никакого
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.04.2014, 10:19 #12
Цитата Сообщение от Владислаучык Посмотреть сообщение
отличил
Не заметно.
Владислаучык
0 / 0 / 1
Регистрация: 21.03.2013
Сообщений: 336
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;
    }
}
такой же бесконечный цикл
alsav22
5417 / 4813 / 442
Регистрация: 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.
Владислаучык
0 / 0 / 1
Регистрация: 21.03.2013
Сообщений: 336
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, можете плз помочь сделать чтобы читало определённую запись, и вставку в середину файла?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.04.2014, 12:35
Привет! Вот еще темы с ответами:

Происходит зацикливание при чтении файла - C++
Доброго времени суток! Ниже находится код, который посимвольно читает файл, и записывает в другой файл часть символов исходного файла,...

При сокращении "Фамилия Имя Отчество" к "Фамилия И.О." пропадают "И.О." - C++
Подскажите, в чём может быть ошибка? Процедура сама по себе работает правильно, а в таком виде нет. ...

У меня выводит имя и фамилия, а отчество не хочет - C++
Введите с клавиатуры терминала массив строк. Каждая строка имеет вид: &quot;Фамилия Имя Отчество&quot; (разделяются одним пробелом). Признак...

Разработка класса: Abiturient: Фамилия, Имя, Отчество, Адрес, Оценки - C++
разработать класс включая в метод Set и Get определить другие методы. Написать программу демонстрирующую работу с этим классом. ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
23.04.2014, 12:35
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru