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

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

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

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

08.12.2010, 18:59. Просмотров 6435. Ответов 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)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.12.2010, 18:59     Решить упражнение на файловый ввод/вывод из книги Лафоре (12 глава)
Посмотрите здесь:
Зацикливание программы. В чем же ошибка? ( Упражнение 5 Глава 7 Лафоре ООП C++) C++
Упражнение из книги Лафоре C++
C++ Упражнение №8 глава 5 из книги Страуструпа
C++ Работа с Классами или разбираем 10 Упражнение 6 главы книги ООП в С++ Р.Лафоре
Упражнение по программированию (Стивен Прата, глава 2, упражнение 3) C++
C++ Упражнение из Лафоре. Тема Перечисления. Как правильно сделать вывод?
C++ Решить задачу на файловый ввод/вывод (игра "Города")
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Revol'veR
23 / 23 / 2
Регистрация: 05.11.2010
Сообщений: 134
13.10.2011, 23:41     Решить упражнение на файловый ввод/вывод из книги Лафоре (12 глава) #16
У меня пока что нет такой практики, чтобы ответить на все вопросы. Главное - нужно понять алгоритм действий, а остальное придёт с опытом. Я тоже новичок и тоже читаю ту же книгу. Правда пока что тяжело сообразить что с нуля, но стараюсь определять в кодах ошибки. Москва не сразу строилась
Bers
Заблокирован
14.10.2011, 00:07     Решить упражнение на файловый ввод/вывод из книги Лафоре (12 глава) #17
Цитата Сообщение от Sylvos Посмотреть сообщение
Зачем нужен статический указатель на файл в классе?
Тут нужно понять идею! Смотрите:

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

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


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

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

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

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

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

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

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

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

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

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

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

Не по теме:

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

aeshes
14.10.2011, 00:20
  #21

Не по теме:

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

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


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

Не по теме:

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

kazak
14.10.2011, 01:35
  #23

Не по теме:

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

kravam
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,439
14.10.2011, 11:18     Решить упражнение на файловый ввод/вывод из книги Лафоре (12 глава) #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);
Хотелось бы не просто достичь результата но и разобраться с этим вопросом, я сам не могу.
aeshes
440 / 203 / 13
Регистрация: 07.10.2011
Сообщений: 462
14.10.2011, 11:28     Решить упражнение на файловый ввод/вывод из книги Лафоре (12 глава) #25
По-моему, ситуация обстоит так
Счетчик-то устанавливается, но флаг состояния "достигнут конец файла" таким методом не сбрасывается, а проверка на конец файла делается именно по флагу, поэтому так оно не работает
Хотя могу и ошибаться. Если ошибаюсь, поправьте
kazak
3034 / 2355 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
14.10.2011, 11:33     Решить упражнение на файловый ввод/вывод из книги Лафоре (12 глава) #26
aeshes, права. Пока установлен один из флагов fail/bad/eof работа с файлом будет не возможна.
kravam
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,439
14.10.2011, 11:35     Решить упражнение на файловый ввод/вывод из книги Лафоре (12 глава) #27
Не знаю, приходится только гадать, а это не наш метод, нам надо знать определённо. Надо знающих. Вот ссылка на всякий случай.
http://www.cplusplus.com/reference/i...ostream/seekp/
kazak
3034 / 2355 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
14.10.2011, 13:02     Решить упражнение на файловый ввод/вывод из книги Лафоре (12 глава) #28
Цитата Сообщение от kravam Посмотреть сообщение
нам надо знать определённо
Решить упражнение на файловый ввод/вывод из книги Лафоре (12 глава)
kravam
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,439
14.10.2011, 13:44     Решить упражнение на файловый ввод/вывод из книги Лафоре (12 глава) #29
Спасибо, дружище! Чё за источник?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.10.2011, 13:51     Решить упражнение на файловый ввод/вывод из книги Лафоре (12 глава)
Еще ссылки по теме:
Лафоре. Глава 11. Задача 2 C++
Правильное ли решение задачи? Лафоре. 3 глава 9 задача C++
C++ Что я сделал не так? Прата С. Глава 2. Упражнение 3
Считывание числа поциферно (задача Лафоре, 3 глава, объяснить код) C++
C++ Сокращение программы, приводит к другому результату. Лафоре 3 глава, 3 задача

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

Или воспользуйтесь поиском по форуму:
kazak
3034 / 2355 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
14.10.2011, 13:51     Решить упражнение на файловый ввод/вывод из книги Лафоре (12 глава) #30
Дейтел "Как программировать на С++".
Yandex
Объявления
14.10.2011, 13:51     Решить упражнение на файловый ввод/вывод из книги Лафоре (12 глава)
Ответ Создать тему
Опции темы

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