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

Файл произвольного доступа - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Делимся знаниями по С++ http://www.cyberforum.ru/cpp-beginners/thread329054.html
По вашему зачем нужна виртуальная функция в программе? Какой от нее толк если она вызывается как обычная функция. Да я знаю что полиморфизм тут. Но по мне так достаточно одного базового класса который играет роль обобщенного интерфейса. Там тоже есть функции... У меня уже есть своя версия насчет виртуальной функции зачем она нужна и как её использовать в пользу в программе. Я хотел бы услышать...
C++ Программа на рекурсию - Перестановка ! Доброго времени суток, уважаемые знатоки. Возникла проблема с решением данной программы. Надеюсь услышать не глупые советы в стиле - решается простой рекурсией, или что тут всё просто как два пальца Суть : Дана строка, состоящая из M попарно различных символов. Вывести все перестановки символов данной строки. Ввод В первой строке файла находится исходная строка. Вывод Вывести в каждой... http://www.cyberforum.ru/cpp-beginners/thread329004.html
C++ Функции языка с++ и считывание данных в массив
Помогите найти ошибку в решении задачки на функции с++ и хранение данных в массиве. Программа должна запрашивать ввод данных (счета при какой-то игре) и сохранять их в массив, после чего считать средний результат. Счет данных и подсчет среднего значения должны управляться отдельными функциями. Максимальное кол-во данных - 10. У пользователя должна быть возможность прерывать ввод данных при вводе...
C++ Пмогите допилить програмку
#include <iostream> using namespace std; int main() { struct list { int data; list *next; list *prev; }; list *cur=0;
C++ Форматирование тексту + ошибки + лишнее http://www.cyberforum.ru/cpp-beginners/thread328954.html
Вот задача + решение // xz.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <iostream> using std::cout; using std::cin; using std::endl;
C++ Функции языка с++ Пожалуйста не поленитесь, прочитайте всё и помогите :) . Заранее СПАСИБО! Разработайте функцию calculate(), принимающую два значения типа double и указатель на функцию, которая принимает в качестве аргументов два значения типа double и возвращает значение типа double. Функция calculate() также должна иметь тип double. Она должна возвращать значение, вычисляемое функцией, на которую указывает... подробнее

Показать сообщение отдельно
Gepar
1175 / 531 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
03.07.2011, 20:47  [ТС]     Файл произвольного доступа
Цитата Сообщение от grizlik78 Посмотреть сообщение
Считывание не работает? Файл можно не смотреть даже.
Нет, оно работает некорректно, притом очень странно, эх ладно, запощу почти полный свой main(надеюсь не испугаю тех кто заходит в тему )
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
#include <iostream>
#include <iomanip>
#include <fstream>
#include "ClientData.h"
using namespace std;
 
void newRecord(fstream&);
void print(fstream&);
int main()
{
    ClientData client;
    fstream file("trans.dat",ios::binary|ios::in|ios::out);
    if (!file)
     cerr<<"Error";
 
    for (int i=0;i<100;i++)
     file.write(reinterpret_cast<const char*>(&client),sizeof(ClientData));
     newRecord(file);
     newRecord(file);
     newRecord(file);
     print(file);
}
 
void newRecord(fstream& file)
{
    if (!file)
     cerr<<"\nSomethin was wrong ...\n";
    cout<<"\nEnter number of new accaunt:\n? ";
    int account;
    cin>>account; //считать номер аккаунта
 
    file.seekp((account-1)*sizeof(ClientData)); //установить указатель на нужный номер
    ClientData client;
    file.read(reinterpret_cast<char*>(&client),sizeof(ClientData)); //считать текущее значение запрошенного аккаунта
 
    //если аккаунт пуст то считать и записать данные
    if(client.getID()==0)
    {
        cout<<"\nEnter name and balance for this client:";
        double balance;
        string name;
        cin>>name>>balance;
        client.setID(account);client.setBalance(balance);client.setName(name);
        file.seekp((account-1)*sizeof(ClientData));
        file.write(reinterpret_cast<const char*>(&account),sizeof(ClientData));
 
        //вывод добавлен чтобы убедиться что сразу после создания записи она нормально считывается
        file.seekp((account-1)*sizeof(ClientData));
        file.read(reinterpret_cast<char*>(&account),sizeof(ClientData));
        cout<<setw(3)<<left<<client.getID()<<setw(10)<<left<<client.getName()<<setw(6)<<left<<client.getBalance()<<endl;
    }
 
    //иначе выдать предупреждение
    else
     cerr<<"\nError, accaunt #"<<account<<" already exist!\n";
}
 
void print(fstream& print)
{
    print.seekp(0);
    ClientData client;
 
    //ищем хотя бы одно заполненное поле в БД
    do
    {
        print.read(reinterpret_cast<char*>(&client),sizeof(ClientData));
    }while (client.getID()==0);
 
    //если такое поле есть то логично вывести подписи к столбцам
    if (client.getID()!=0)
    {
        cout<<setw(3)<<left<<"ID"<<setw(10)<<left<<"NAME"<<setw(6)<<left<<"BALANCE"<<endl;
    }
    //иначе выйти из функции так как все поля БД пусты
    else
     return;
 
    print.clear();//сбросить флаг конца файла
    print.seekp(0);
 
    print.read(reinterpret_cast<char*>(&client),sizeof(ClientData)); //считать первую запись
    while(!print.eof())
    {
        //если запись существует то вывести данные
        if (client.getID()!=0)
        {
            cout<<setw(3)<<left<<client.getID()<<setw(10)<<left<<client.getName()<<setw(6)<<left<<client.getBalance()<<endl;
        }
        print.read(reinterpret_cast<char*>(&client),sizeof(ClientData));
    }
    print.clear(); //сбросить флаг конца файла для выполения последующих операций
 
}
Посмотрите пожалуйста, тут всё очень и очень интересно:
1) Я вызываю 3 раза создание нового клиента (есть менюшка но это ещё + код, не буду запутывать), после его создания я добавил считывание и вывод данных. По работе этого я вижу что всё хорошо и данные после записи считываются нормально. Если пытаешься перезаписать данные то функция отлично видит что они уже есть так что пишет вроде нормально, вроде.
2)Я вызываю функцию для печати данных и что я вижу: поле номер считалось нормально, поле имя пустое(чаще всего), а в поле баланс поселилось что-то непонятное вида 2.53354e-307 которое появляется всегда в нём.

Помогите, справиться с этим злосчастным классом, а, очень хочется разобраться с ним
На всякий случай креплю все файлы в zip архиве, может кому так будет удобнее.
Вложения
Тип файла: zip c++.zip (22.5 Кб, 13 просмотров)
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru