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

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

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

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

08.12.2010, 18:59. Просмотров 6518. Ответов 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
Revol'veR
23 / 23 / 2
Регистрация: 05.11.2010
Сообщений: 134
13.10.2011, 23:41 #16
У меня пока что нет такой практики, чтобы ответить на все вопросы. Главное - нужно понять алгоритм действий, а остальное придёт с опытом. Я тоже новичок и тоже читаю ту же книгу. Правда пока что тяжело сообразить что с нуля, но стараюсь определять в кодах ошибки. Москва не сразу строилась
0
Bers
Заблокирован
14.10.2011, 00:07 #17
Цитата Сообщение от Sylvos Посмотреть сообщение
Зачем нужен статический указатель на файл в классе?
Тут нужно понять идею! Смотрите:

Представьте себе карету, которую везут упряжка из трех лошадок.
Каждая лошадка - это экземпляр класса.
Каждая лошадка может иметь свой цвет, возраст, и скорость передвижения.

Но поскольку все лошадки в одной упряжке, то параметр "скорость" у них у всех одинаковый.
Получается, что нет никакого смысла каждой лошадке помнить одно и тоже число.
Нет смысла каждой лошадке помнить свою скорость.


Ну так вот, статический элемент данных класса - это и есть поле, общее для всех объектов данного класса.

То есть, возвраст и цвет у каждой лошадке свой уникальный. А скорость у всех - общая. Одинаковая.

Всегда, когда вам захочется сделать для всех объектов класса какое то поле общим - вы делаете его статиком

Добавлено через 7 минут
Цитата Сообщение от Sylvos Посмотреть сообщение
И почему файл который создается в бинарном режиме можно открыть обычным блокнотом я думал что там должно быть что то типа машинyого кода "‰Ў‡ЄЄъ8¶H"
Бинарный режим - это просто последовательность байтов. И ничего более.

Можно записать в файл символы и строки, и читать так же.
А можно записывать в файл последовательности байтов, и читать так же.

Структура в памяти компьютера - это просто некоторая область памяти, которая имеет определенный размер.

Вместо того, что бы записывать в файл строки и символы, можно открыть файл в бинарном режиме, и сразу закинуть туда всю структуру целиком - все что имелось в данный момент по адресу начала структуры окажется в файле
2
aeshes
440 / 203 / 13
Регистрация: 07.10.2011
Сообщений: 462
14.10.2011, 00:07 #18
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Добавь в функцию Load() первой строкой строку
file.clear();

Дело в том, что после первой попытки вывода ты достиг конца файла и соответствующий флаг установился в 1. Поэтому все последующие проверки while(!file.eof()) не проходили, следовательно. из файла просто ничего не читалось, потому что флажок eof говорил твоему потоку, что конец файла уже достигнут.

Метод clear() чистит эти флажки, поэтому теперь повторный вывод из файла будет возможен
3
Bers
Заблокирован
14.10.2011, 00:14 #19
Цитата Сообщение от LineStown Посмотреть сообщение
И немного хотелось бы разьяснения понятия файловый поток с физической точки зрения.
Как я понимаю - это как бы "мост" между файлом и пользователем
Да. Вы правильно понимаете.

Главное понять: файловый поток - это средство доставки данных от пользователя к самому файлу.

А файл - это не обязательно текстовый документ, это может быть что угодно, что умеет получать/отправлять данные. Например, принтер, или даже окошко виндовс.
1
kazak
14.10.2011, 00:16
  #20

Не по теме:

aeshes, ну хоть кто-то догадался

0
aeshes
14.10.2011, 00:20
  #21

Не по теме:

kazak, наступала на эти грабли часто раньше, поэтому теперь об этом помню

1
Sylvos
-25 / 6 / 1
Регистрация: 06.04.2011
Сообщений: 85
14.10.2011, 00:27 #22
aeshes,
СПАСИБО добавил а начало Load() и Save() и все отлично заработало file.clear();


Добавлено через 4 минуты

Не по теме:

kazak, а вы смотрели и молчали я же не просил готовый код мне просто нужна была эта подсказка

0
kazak
14.10.2011, 01:35
  #23

Не по теме:

я просто не успел

0
kravam
быдлокодер
1700 / 887 / 45
Регистрация: 04.06.2008
Сообщений: 5,494
14.10.2011, 11:18 #24
aeshes, тут что-то не то, надо разобраться.
Вот метод Load
C++
1
2
3
4
5
6
7
8
9
10
11
12
void Name::Load()                       //Загружает данные из файла в поля класса и выводит их на екран, делате так пока не дойдет до конца файла
{
        file.seekg(0, ios::beg);         //Перевести указатель файла на начало файла             
        printf ("qqqqqqqqqqqq\n");
        while(!file.eof())                      //До тех пор пока не дойдет до конца файла
        {
                file>>n>>f>>o>>num;             //Читать даные из файла и записывать их в поля
                if(file.eof())                  //Если конец файла выйти из цикла не вводить конец файла на екран
                        break;                  
                Cout();                                 //Вывести на екран поля класса
        }
}
Благодаря этому:
file.seekg(0, ios::beg);

счётчик должен устанавливаться в начал файла и БЕЗ ИСПОЛЬЗОВАНИЯ file.clear();
А он не устанавливается. Также он не устанавливается и при
C++
1
2
3
file.seekp(0, ios::beg);
//Или
file.seekp(0);
Хотелось бы не просто достичь результата но и разобраться с этим вопросом, я сам не могу.
0
aeshes
440 / 203 / 13
Регистрация: 07.10.2011
Сообщений: 462
14.10.2011, 11:28 #25
По-моему, ситуация обстоит так
Счетчик-то устанавливается, но флаг состояния "достигнут конец файла" таким методом не сбрасывается, а проверка на конец файла делается именно по флагу, поэтому так оно не работает
Хотя могу и ошибаться. Если ошибаюсь, поправьте
0
kazak
3038 / 2359 / 157
Регистрация: 11.03.2009
Сообщений: 5,405
Завершенные тесты: 1
14.10.2011, 11:33 #26
aeshes, права. Пока установлен один из флагов fail/bad/eof работа с файлом будет не возможна.
0
kravam
быдлокодер
1700 / 887 / 45
Регистрация: 04.06.2008
Сообщений: 5,494
14.10.2011, 11:35 #27
Не знаю, приходится только гадать, а это не наш метод, нам надо знать определённо. Надо знающих. Вот ссылка на всякий случай.
http://www.cplusplus.com/reference/iostream/ostream/seekp/
0
kazak
3038 / 2359 / 157
Регистрация: 11.03.2009
Сообщений: 5,405
Завершенные тесты: 1
14.10.2011, 13:02 #28
Цитата Сообщение от kravam Посмотреть сообщение
нам надо знать определённо
Решить упражнение на файловый ввод/вывод из книги Лафоре (12 глава)
1
kravam
быдлокодер
1700 / 887 / 45
Регистрация: 04.06.2008
Сообщений: 5,494
14.10.2011, 13:44 #29
Спасибо, дружище! Чё за источник?
0
kazak
3038 / 2359 / 157
Регистрация: 11.03.2009
Сообщений: 5,405
Завершенные тесты: 1
14.10.2011, 13:51 #30
Дейтел "Как программировать на С++".
0
14.10.2011, 13:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.10.2011, 13:51
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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