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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 51, средняя оценка - 4.98
LineStown
66 / 66 / 3
Регистрация: 04.08.2010
Сообщений: 420
Завершенные тесты: 1
#1

Решить упражнение на файловый ввод/вывод из книги Лафоре (12 глава) - C++

08.12.2010, 18:59. Просмотров 6512. Ответов 40
Метки нет (Все метки)

Доброго времени суток.
В очередной раз обращаюсь за советом касательно разъяснения задачи
Другим подходом к добавлению файлового потока к объекту является превращение самого этого потока в
статическую компоненту объекта. Для чего это делается? Ну, часто бывает проще представить себе поток связанным
с классом в целом, а не с отдельными его объектами. К тому же, гораздо правильнее открывать поток только один
раз для записи и чтения всего, что нужно. Например, мы открываем файл и начинаем последовательное чтение.
Функция чтения всякий раз возвращает данные для следующего объекта. Указатель файла сдвигается при этом
автоматически, так как между чтениями файл мы не закрываем.
Понимаю типы ifstream, ofstream как записать в файл класс, как считать. Но тут что делать вообще не понимаю.
Как полностью считать в
C++
1
static fstream file
весь файл, как из этого
C++
1
file
выдирать нужную запись\

Вот решенная задача которую нужно переделать\ (в ней вроде бы все просто)
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
#include<iostream>
#include<fstream>
using namespace std;
class Persona
{
private:
    int number;
    char surname[15];
    char name[15];
    char surname2[15];
public:
    void bern()
    {
        ofstream file;
        file.open("Persona1204.dat",ios::binary|ios::app);
        file.write((char*)this,sizeof(*this));
        file.close();
    }
    void read(int a)
    {
        ifstream file;
        file.open("Persona1204.dat",ios::binary);
        file.seekg((a-1)*sizeof(Persona));
        file.read((char*)this,sizeof(*this));
        file.close();
    }
    static int count()
    {
        ifstream file;
        file.open("Persona1204.dat",ios::binary);
        file.seekg(0,ios::end);
        return (int)(file.tellg()/sizeof(Persona));
    }
    friend istream& operator>>(istream& s,Persona& p)
    {
        cout << "Введите номер: ";
        s >> p.number;
        cout << "Введите фамилию: ";
        s >> p.surname;
        cout << "Введите имя: ";
        s >> p.name;
        cout << "Введите отчество: ";
        s >> p.surname2;
        p.bern();
        return s;
    }
    friend ostream& operator<<(ostream& s,Persona& p)
    {
        int a;
        s << "Всего записей: " << p.count() << endl;
        s << "Какую вывести: ";
        cin >> a;
        p.read(a);
        s << p.number << "\t" << p.surname << "\t" << p.name << "\t" << p.surname2 << endl;
        return s;
    }
};
int main()
{
    setlocale(LC_ALL,"Russian");
    Persona p;
    //cin >> p;
    cout << p;
    return EXIT_SUCCESS;
}
Добавлено через 39 минут
И немного хотелось бы разьяснения понятия файловый поток с физической точки зрения.
Как я понимаю - это как бы "мост" между файлом и пользователем

Добавлено через 52 минуты
Товарищи Гуру. хотелось бы услышать хоть намек, куда смотреть)

Добавлено через 3 часа 41 минуту
Апну на правах важности темы)
1
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.12.2010, 18:59
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Решить упражнение на файловый ввод/вывод из книги Лафоре (12 глава) (C++):

Зацикливание программы. В чем же ошибка? ( Упражнение 5 Глава 7 Лафоре ООП C++) - C++
Миллион раз пересмотрел, ну не вижу ошибку и все тут :(. Должна же остановка на вводе быть! Что туда передается.... Не понятно... Помогите...

Упражнение из книги Лафоре - C++
//11.cpp #include &lt;iostream&gt; using namespace std; class sterling { private: long pounds; int shil; int pens;

Упражнение №8 глава 5 из книги Страуструпа - C++
Здравствуйте. Помогите решить задание. Напишите программу,считывающую ряд чисел и записывающую их в vector&lt;int&gt;.После того как...

Работа с Классами или разбираем 10 Упражнение 6 главы книги ООП в С++ Р.Лафоре - C++
Доброго времени суток господа. Подскажите пожалуйста каким образом можно объединить классы? Почему при создание объекта ship в main выдает...

Упражнение по программированию (Стивен Прата, глава 2, упражнение 3) - C++
2 Глава, вопрос 3. Напишите программу на С++, которая использует три определяемых пользователем функции (включая main()) и генерирует...

Упражнение из Лафоре. Тема Перечисления. Как правильно сделать вывод? - C++
Условие: в программе определен печесляемый тип данных etype, отражающий должность сотрудника enum etype { laborer, secretary, manager,...

40
masterdov
0 / 0 / 0
Регистрация: 23.10.2016
Сообщений: 35
30.10.2016, 18:21 #31
Не создается файл
0
Миниатюры
Решить упражнение на файловый ввод/вывод из книги Лафоре (12 глава)  
masterdov
0 / 0 / 0
Регистрация: 23.10.2016
Сообщений: 35
30.10.2016, 18:30 #32
На счет создания файла так и не понял, но его вывод, а именно, кнопка 4, выводит пустые поля, в которых я изменил лишь текст, кроме номера телефона, который как раз и выводится, как показано в миниатюре выше, как это исправить? Еще как я понимаю, это где то в функции Load()
0
masterdov
0 / 0 / 0
Регистрация: 23.10.2016
Сообщений: 35
30.10.2016, 18:36 #33
Изучая списки с++ , я наткнулся на эту задачу Решить упражнение на файловый ввод/вывод из книги Лафоре (12 глава)
Обратите внимание на подредактированный код Sylvos
или вот он :
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
#include<iostream>          //Поключаем библиотеку iostream
using namespace std;        //Чтобы не писать std:: перед каждим cin или cout
#include<fstream>           //Поключаем библиотеку fstream
class Name                  //Клаас Name
{
private:                    //Закрытые поля класся
    char n[50],f[50],o[50]; //Имя, Фамилия, Отчество
    unsigned long num;      //Номер телефона
    static fstream file;    //Статический Указатель на Файл
public:                     //Открытые методы класса
    Name();                 //Конструктор по умолчанию
    void Open();            //Создаеть файл
    void Save();            //Сохранить поля класса в файл
    void Load();            //Загружает данные из файла в поля класса и выводит их на екран, делате так пока не дойдет до конца файла
    void Cout();            //Вывод на екран полей класса
    void Cin();             //Ввод даныхв поля класса
    void Menu();            //Меню выбора
};
//-----------------------------------------------------------------------------------
fstream Name::file;
//-----------------------------------------------------------------------------------
Name::Name()                //Конструктор по умолчанию
{
    Open();                 //Запустить метод Oen(); который Создаеть файл
}
//-----------------------------------------------------------------------------------
void Name::Open()           //Создаеть файл
{
    file.open("D:\\Data.txt",ios::in|ios::out|ios::binary|ios::app);
    //Создать файл Data.txt на диске D:\ с возможностью записи, чтени, в бинарном режиме, записывать даные в конец файла
}
//-----------------------------------------------------------------------------------
void Name::Save()           //Сохранить поля класса в файл
{
    file.seekp(0,ios::end);     //Перевести указатель файла в конец файла
    file<<n<<' '<<f<<' '<<o<<' '<<num<<' '; //сохрание данных в файл
}
//-----------------------------------------------------------------------------------
void Name::Load()           //Загружает данные из файла в поля класса и выводит их на екран, делате так пока не дойдет до конца файла
{
    file.seekp(0,ios::beg);     //Перевести указатель файла на начало файла     
    while(!file.eof())          //До тех пор пока не дойдет до конца файла
    {
        file>>n>>f>>o>>num;     //Читать даные из файла и записывать их в поля
        if(file.eof())          //Если конец файла выйти из цикла не вводить конец файла на екран
            break;          
        Cout();                 //Вывести на екран поля класса
    }
}
//-----------------------------------------------------------------------------------
void Name::Cout()           //Вывод на екран полей класса
{
    cout<<"Имя: "<<n<<endl                      //Выводит текст Имя: и поле класса n
        <<"Фамилия: "<<f<<endl                  //Выводит текст Фамилия: и поле класса f
        <<"Отчество: "<<o<<endl                 //Выводит текст Отчество: и поле класса o
        <<"Номер телефона: "<<num<<endl<<endl;  //Выводит текст Номер телефона: и поле класса num
}
//-----------------------------------------------------------------------------------
void Name::Cin()            //Ввод даныхв поля класса
{
    cout<<"Введите Имя: ";      //Выводит текст Введите Имя:
    cin>>n;                     //Ввод имени в поле n
    cout<<"Введите Фамилию: ";  //Выводит текст Введите Фамилия:
    cin>>f;                     //Ввод фамили в поле f
    cout<<"Введите Отчество: "; //Выводит текст Введите Отчество:
    cin>>o;                     //Ввод отчества в поле o
    cout<<"Введите Номер телефона: ";//Выводит текст Введите Номер телефона:
    cin>>num;                   //Ввод телефона в поле num
}
//-----------------------------------------------------------------------------------
void Name::Menu()           //Меню выбора
{
    char ch;                //Перемменная через которую пользователь производит ввод
    do                      //Запуск цикла
    {
        cout<<endl;
        cout<<"1. Ввод новой анкеты"<<endl                  //Ну тут думаю итка все понятно
            <<"2. Вывести анкету на екран"<<endl            //
            <<"3. Запись анкеты в файл"<<endl               //
            <<"4. Вывести содержимое файла на экран"<<endl  //
            <<"5. Выход"<<endl<<endl;
        cin>>ch;            //Ввод пользователя
        cout<<endl;
        switch(ch)          //Анализ ввода пользователя
        {
            case'1':Cin();break;    
            case'2':Cout();break;
            case'3':Save();break;
            case'4':Load();break;
            case'5':break;
            default:cout<<"Не правильный ввод даных повторите попытку"<<endl;system("PAUSE");
        }
    }
    while(ch!='5');//Условие цикла Пока пользователь не введет 5
}
//-----------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------
int main()
{
    setlocale(LC_ALL,"Rus");
    Name n;
    n.Menu();
    return 0;
}
Дело в том, что, когда я решил его опробовать, то при выборе вывода содержимого файла , вывод циклится и выводит пустые поля имени отчества и фамилии, а поле номера телефона выводит. Кажется ошибка либо в Load(); либо Cout(), подскажите, как это исправить
0
hoggy
6672 / 2856 / 491
Регистрация: 15.11.2014
Сообщений: 6,364
Завершенные тесты: 1
30.10.2016, 18:52 #34
Цитата Сообщение от masterdov Посмотреть сообщение
Кажется ошибка либо в Load(); либо Cout()
вместо того, что бы предоставить содержимое файла "D:\\Data.txt",
предлагаете погадать?
0
masterdov
0 / 0 / 0
Регистрация: 23.10.2016
Сообщений: 35
30.10.2016, 19:11 #35
Файл создается, ошибка явно в Load(), тк при выбора 4, а это функция Load() циклится
скрин прилагается
Еще я сейчас понял, счётчик должен устанавливаться в начал файла, а он не устанавливается ни при
C++
1
2
3
file.seekp(0, ios::beg);
//Или
file.seekp(0);
ни при
C++
1
file.clear();
на скрине я изменил для себя Имя и Отчество на Номер билета и Номер места
0
Миниатюры
Решить упражнение на файловый ввод/вывод из книги Лафоре (12 глава)  
hoggy
6672 / 2856 / 491
Регистрация: 15.11.2014
Сообщений: 6,364
Завершенные тесты: 1
30.10.2016, 19:16 #36
Цитата Сообщение от masterdov Посмотреть сообщение
Еще я сейчас понял
то есть вы модифицировали код.
но нам его не показали.
и не желаете показывать файл с данными
на которых воспроизвелась проблема.

а нафига? тут же одни телепаты тусят.
сейчас кто нибудь прямо напрямки в моск подключиццо.
вот только связь с астралом наладиццо.
0
masterdov
0 / 0 / 0
Регистрация: 23.10.2016
Сообщений: 35
30.10.2016, 19:22 #37
Извините, думал не сильно важно
Я изменил лишь в " " и дописал строку
это
C++
1
2
3
4
5
6
7
8
9
10
11
void Name::Cin()            //Ввод данных в поля класса
{
    cout<<"Введите Имя: ";      //Выводит текст Введите Имя:
    cin>>n;                     //Ввод имени в поле n
    cout<<"Введите Фамилию: ";  //Выводит текст Введите Фамилия:
    cin>>f;                     //Ввод фамили в поле f
    cout<<"Введите Отчество: "; //Выводит текст Введите Отчество:
    cin>>o;                     //Ввод отчества в поле o
    cout<<"Введите Номер телефона: ";//Выводит текст Введите Номер телефона:
    cin>>num;                   //Ввод телефона в поле num
}
на это
C++
1
2
3
4
5
6
7
8
9
10
11
12
void Name::Cin()            //Ввод даных в поля класса
{
    
                  //Ввод имени в поле n
    cout << "№  места: ";  //Выводит текст Какое место:
    cin >> n;                   // ввод в поле n
    cout << "Введите Фамилия: "; //Выводит текст Введите Фамилия:
    cin >> o;                     //Ввод отчества в поле o
    cout << "Введите Номер телефона: ";//Выводит текст Введите Номер телефона:
    cin >> num;                   //Ввод телефона в поле num
    cout << " № билета : " << f << endl;// Вывод текст Ваш № билети поле f
}
0
masterdov
0 / 0 / 0
Регистрация: 23.10.2016
Сообщений: 35
31.10.2016, 03:32 #38
Я еще немного покапался в коде и теперь ничего не циклится, но не выводится пара полей и вместо номера билета мусор
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
class Name                  //Клаас Name
{
private:                    //Закрытые поля класся
    char n[20], o[20]; 
    int f;
    int m=100;//место, билет , фамилия
    unsigned long num;      //Номер телефона
    static fstream file;    //Статический Указатель на Файл
public:                     //Открытые методы класса
    Name();                 //Конструктор по умолчанию
    void Open();            //Создаеть файл
    void Save();            //Сохранить поля класса в файл
    void Load();            //Загружает данные из файла в поля класса и выводит их на екран, делате так пока не дойдет до конца файла
    void Cout();            //Вывод на екран полей класса
    void Cin();             //Ввод даныхв поля класса
    void Menu();            //Меню выбора
};
//-----------------------------------------------------------------------------------
fstream Name::file;
//-----------------------------------------------------------------------------------
Name::Name()                //Конструктор по умолчанию
{
    Open();                 //Запустить метод Oen(); который Создаеть файл
}
//-----------------------------------------------------------------------------------
void Name::Open()           //Создаеть файл
{
    file.open("С:\\УЧЕБА\\Data.txt", ios::in | ios::out | ios::binary | ios::app);
    //Создать файл Data.txt на диске C:\ с возможностью записи, чтени, в бинарном режиме, записывать даные в конец файла
}
//-----------------------------------------------------------------------------------
void Name::Save()           //Сохранить поля класса в файл
{
    file.clear();
    file.seekp(0, ios::end);     //Перевести указатель файла в конец файла
    file << n << ' ' << f << ' ' << o << ' ' << num << ' '; //сохрание данных в файл
    
}
//-----------------------------------------------------------------------------------
void Name::Load()           //Загружает данные из файла в поля класса и выводит их на екран, делате так пока не дойдет до конца файла
{
    file.seekp(0, ios::beg);     //Перевести указатель файла на начало файла     
    while (!file.eof())          //До тех пор пока не дойдет до конца файла
    {
        file >> n >> f >> o >> num;     //Читать даные из файла и записывать их в поля
        if (file.eof())          //Если конец файла выйти из цикла не вводить конец файла на екран
            break;
        
        Cout();   
        break;//Вывести на екран поля класса
    }
}
//-----------------------------------------------------------------------------------
void Name::Cout()           //Вывод на екран полей класса
{
    cout << "№  места: " << n << endl;                    //Выводит текст номер места: и поле класса n
    cout << "№  билета: " << f << endl;                //Выводит текст номер билета : и поле класса f
    cout << "Фамилия : " << o << endl;               //Выводит текст Фамилия: и поле класса o
    cout << "Номер телефона: " << num << endl;  //Выводит текст Номер телефона: и поле класса num
}
//-----------------------------------------------------------------------------------
void Name::Cin()            //Ввод даных в поля класса
{
    cout << "№  места: ";  //Выводит текст Какое место:
    cin >> n;                   // ввод в поле n
    cout << "Введите Фамилия: "; //Выводит текст Введите Фамилия:
    cin >> o;                     //Ввод отчества в поле o
    cout << "Введите Номер телефона: ";//Выводит текст Введите Номер телефона:
    cin >> num;                   //Ввод телефона в поле num
    cout << " № билета : " << f << endl;// Вывод текст Ваш № билети поле f
}
//-----------------------------------------------------------------------------------
void Name::Menu()           //Меню выбора
{
    char ch;                //Перемменная через которую пользователь производит ввод
    do                      //Запуск цикла
    {
        cout << endl;
        cout << "1. Купить билет " << endl                  
            << "2. Вывести купленный билет экран" << endl            
            << "3. Сохранить чек в файл" << endl              
            << "4. Вывести содержимое файла на экран" << endl  
            << "5. Выход" << endl << endl;
        cin >> ch;            //Ввод пользователя
        cout << endl;
        switch (ch)          //Анализ ввода пользователя
        {
        case'1':Cin(); break;
        case'2':Cout(); break;
        case'3':Save(); break;
        case'4':Load(); break;
        case'5':break;
        default:cout << "Не правильный ввод даных повторите попытку" << endl; 
            system("pause");
        }
    } while (ch != '5');//Условие цикла Пока пользователь не введет 5
}
//-----------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------
int main()
{
 
    setlocale(LC_ALL, "Rus");
    Name n;
    n.Menu();
    _getch();
    return 0;
}
0
Миниатюры
Решить упражнение на файловый ввод/вывод из книги Лафоре (12 глава)  
nd2
2353 / 1943 / 681
Регистрация: 29.01.2016
Сообщений: 6,326
31.10.2016, 03:42 #39
Цитата Сообщение от masterdov Посмотреть сообщение
Я еще немного покапался в коде и теперь ничего не циклится, но не выводится пара полей и вместо номера билета мусор
Код переписываешь, а файл после этого удаляешь?
0
masterdov
0 / 0 / 0
Регистрация: 23.10.2016
Сообщений: 35
31.10.2016, 04:02 #40
nd2, нет
0
nd2
2353 / 1943 / 681
Регистрация: 29.01.2016
Сообщений: 6,326
31.10.2016, 04:23 #41
Цитата Сообщение от hoggy Посмотреть сообщение
не желаете показывать файл с данными
С содержимым там всё в порядке?
0
31.10.2016, 04:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.10.2016, 04:23
Привет! Вот еще темы с ответами:

Решить задачу на файловый ввод/вывод (игра "Города") - C++
Не могу понять задачу и решить её на Си!!! Срочно! Дело в том что я сейчас на зачёте, и мне больше некуда обратиться. Помогите прошу...

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

Лафоре. Глава 11. Задача 2 - C++
Решал задачку из учебника - Лафоре. Глава 11. Задача 2. Вот код #include &lt;iostream&gt; #include &lt;iomanip&gt; #include &lt;conio.h&gt; ...

Правильное ли решение задачи? Лафоре. 3 глава 9 задача - C++
Представьте, что вы собираетесь пригласить к себе шестерых гостей, но за вашим столом могут разместиться всего лишь 4 человека Сколькими...


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

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

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