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

Из файла необходимо прочитать записи, установить ключи, позиции и количество записей - C++

Восстановить пароль Регистрация
 
Lahden
1 / 1 / 0
Регистрация: 26.09.2013
Сообщений: 52
20.04.2014, 18:26     Из файла необходимо прочитать записи, установить ключи, позиции и количество записей #1
Из файла необходимо прочитать записи, установить ключи, позиции и количество записей
это делаю вот так
C++
1
2
3
4
5
6
7
8
9
10
bool CMyFile :: open (const char* name)
{
    m_f.open (name, ios_base :: in | ios_base :: out | ios_base :: binary);
    if (!m_f)
        return false;
    m_name = new char [strlen(name)+1];
    strcpy_s(m_name, strlen(name)+1, name);
    setA ();
    return true;
}
И нужно потом вывести все записи, которые есть в этом файле
Написал вот такую функцию
C++
1
2
3
4
5
6
7
CAuthor* CMyFile :: getRec (int index)
{
    long pos (m_a.getPos (index));
    m_f.seekg(pos, ios::beg);
    m_f >> m_r;
    return &m_r;
}
Но он ничего не выводит, точнее выводит только то числовое член-данное, которое осталось от последнего прочитанного объекта. Как можно исправить, чтобы работало?
Перегрузка для функции получения записи
C++
1
2
3
4
5
6
7
8
9
10
11
istream& operator >> (istream& in, CAuthor& obj)
{
    char buf1 [20];
    in >> buf1;
    char buf2 [20];
    in >> buf2;
    obj.setName (buf1);
    obj.setColor (buf2);
    in >> obj.m_weight;
    return in;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.04.2014, 18:26     Из файла необходимо прочитать записи, установить ключи, позиции и количество записей
Посмотрите здесь:

прочитать данные из файла в матрицу с указанной позиции C++
Как в функции открытия файла fopen() задать путь через ключи C++
C++ Как в функции открытия файла fopen() задать путь через ключи
Очистка файла с позиции C++
C++ Прочитать из файла
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.04.2014, 20:04     Из файла необходимо прочитать записи, установить ключи, позиции и количество записей #2
Что за данные в файле, и как они туда записывались?
Lahden
1 / 1 / 0
Регистрация: 26.09.2013
Сообщений: 52
20.04.2014, 23:52  [ТС]     Из файла необходимо прочитать записи, установить ключи, позиции и количество записей #3
Файл бинарный, в нем объекты моего авторского класса, записывались вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    char* name[7] = {"Apple", "Kiwi", "Lemon", "Grapes", "Lime", "Melon", "Orange"};
    char* color [7] = {"Red", "Brown", "Yellow", "Blue", "Green", "Yellow", "Orange"};
    int weight [7] = {250, 100, 250, 450, 200, 1000, 350};
    char filename [20];
    cout << "Enter file name -> ";
    cin >> filename;
    fstream myFile (filename, ios_base :: out | ios_base :: binary | ios_base :: trunc);
    if (!myFile)
        return 1;
    for (int i(0); i < 7; i++)
    {
        CFruit *fruit = new CFruit (name[i], color[i], weight [i]);
        myFile << *fruit;
        delete fruit;
    }
    myFile.close ();
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.04.2014, 01:33     Из файла необходимо прочитать записи, установить ключи, позиции и количество записей #4
Реализацию оператора, вот для этого, покажите:
Цитата Сообщение от Lahden Посмотреть сообщение
C++
1
myFile << *fruit;
Добавлено через 3 минуты
Цитата Сообщение от Lahden Посмотреть сообщение
Файл бинарный,
Если данные в файл записывались бинарными методами (?), то почему читаете - текстовыми?
Цитата Сообщение от Lahden Посмотреть сообщение
Перегрузка для функции получения записи:
C++
1
2
3
4
5
6
7
8
9
10
11
istream& operator >> (istream& in, CAuthor& obj)
{
    char buf1 [20];
    in >> buf1;
    char buf2 [20];
    in >> buf2;
    obj.setName (buf1);
    obj.setColor (buf2);
    in >> obj.m_weight;
    return in;
}
Lahden
1 / 1 / 0
Регистрация: 26.09.2013
Сообщений: 52
21.04.2014, 18:44  [ТС]     Из файла необходимо прочитать записи, установить ключи, позиции и количество записей #5
Реализация
C++
1
2
3
4
5
6
7
ostream& operator << (ostream& out, const CAuthor& obj)
{
    out << obj.m_name << '\t';
    out << obj.m_color << '\t';
    out << obj.m_weight << '\t';
    return out;
}
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.04.2014, 02:16     Из файла необходимо прочитать записи, установить ключи, позиции и количество записей #6
Цитата Сообщение от Lahden Посмотреть сообщение
Реализация
Где здесь что-то бинарное? Зачем пишите?
Цитата Сообщение от Lahden Посмотреть сообщение
Файл бинарный
Весь код показывайте. В выложенных кусках ошибок не вижу.
Lahden
1 / 1 / 0
Регистрация: 26.09.2013
Сообщений: 52
23.04.2014, 20:04  [ТС]     Из файла необходимо прочитать записи, установить ключи, позиции и количество записей #7
Класс файла (Ссылки на объекты авторского класса, класса карты файла, указатель на строку с именем файла и объект класса fstream)
Кликните здесь для просмотра всего текста
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
#include "MyFile.h"
#include <cstring>
CMyFile :: CMyFile ()
: m_name (new char [1])
, m_r (*(new CFruit))
, m_a (*(new CFileCard))
{
    *m_name = '\0';
}
CMyFile :: ~CMyFile()
{
    delete m_name;
    delete &m_r;
    delete &m_a;
}
bool CMyFile :: add (const char* name, const char* color, int weight)
{
    m_f.seekp(0, ios :: end);
    if (find (name) == 0)
        return false;
    m_r = *(new CFruit (name, color, weight));
    streampos pos = m_f.tellg();
    m_f << m_r;
    m_a.add(name, pos);
    return true;
}
bool CMyFile :: del (const char* name)
{
    int j (m_a.getIndex (name));
    if (j < 0)
        return false;
    m_a.del(j);
    save();
    return true;
}
bool CMyFile :: open (const char* name)
{
    m_f.open (name, ios_base :: in | ios_base :: out | ios_base :: binary);
    if (!m_f)
        return false;
    m_name = new char [strlen(name)+1];
    strcpy_s(m_name, strlen(name)+1, name);
    setA ();
    return true;
}
CFruit* CMyFile :: find (const char* name)
{
    int j = m_a.getIndex(name);
    if (j == -1)
        return 0;
    m_r = *(getRec(j));
    return &m_r;
}
int CMyFile :: getN () const
{
    return m_a.getN();
}
CFruit* CMyFile :: getRec (int index)
{
    long pos (m_a.getPos (index));
    m_f.seekg(pos, ios::beg);
    m_f >> m_r;
    return &m_r;
}
void CMyFile :: setA()
{
    long pos;
    pos = m_f.tellg();
    while (m_f >> m_r)
    {
        m_a.add(m_r.getName(), pos);
        pos = m_f.tellg();
    }
}
void CMyFile :: save()
{
    fstream f_save("tmp", ios_base :: binary | ios_base :: out | ios_base :: trunc);
    int n (m_a.getN());
    int i(0);
    while (i<n)
    {
        f_save << *(getRec(i));
    }
    m_f.close();
    f_save.close();
    _unlink(m_name);
    rename ("tmp", m_name);
}
double CMyFile :: averageWeight (const char* color)
{
    double sum (0.0);
    int amount (0);
    while (m_f >> m_r)
    {
        if (m_r == color)
        {
            sum += m_r.getWeight();
            amount++;
        }
    }
    if (amount == 0)
        return 0;
    return sum/amount;
}

Карта файла (ключи, позиции и количество записей)
Кликните здесь для просмотра всего текста
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
#include "FileCard.h"
#include <cstring>
#include <iostream>
using namespace std;
CFileCard :: CFileCard ()
: m_n (0)
{
}
CFileCard :: ~CFileCard ()
{
    for (int j(0); j < m_n; j++)
        delete m_key [j];
}
bool CFileCard :: add (const char* key, long position)
{
    if (getIndex(key) == -1)
    {
        m_key[m_n] = new char [strlen(key)+1];
        strcpy_s( m_key[m_n], strlen(key)+1, key);
        m_pos[m_n++] = position;
        return true;
    }
    else
        return false;
}
bool CFileCard :: del (int index)
{
    int j = index;
    if (j<0)
        return false;
    delete m_key [j];
    while (j < m_n - 1)
        m_key [j++] = m_key [j+1];
    j = index;
    while (j < m_n - 1)
        m_pos [j++] = m_pos [j+1];
    m_n--;
    return true;
}
int CFileCard :: getIndex (const char* key)
{
    for (int i(0); i< m_n; i++)
        if (!strcmp(key, m_key[i]))
            return i;
    return -1;
}
long CFileCard :: getPos (int index)
{
    return m_pos [index];
}
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.04.2014, 20:13     Из файла необходимо прочитать записи, установить ключи, позиции и количество записей #8
И где здесь то, что во 2, 3, 5 постах?
Lahden
1 / 1 / 0
Регистрация: 26.09.2013
Сообщений: 52
23.04.2014, 20:40  [ТС]     Из файла необходимо прочитать записи, установить ключи, позиции и количество записей #9
Вот
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
#include "Fruit.h"
ostream& operator << (ostream& out, const CFruit& obj)
{
    out << obj.m_name << '\t';
    out << obj.m_color << '\t';
    out << obj.m_weight << '\t';
    return out;
}
istream& operator >> (istream& in, CFruit& obj)
{
    char buf1 [20];
    in >> buf1;
    char buf2 [20];
    in >> buf2;
    obj.setName (buf1);
    obj.setColor (buf2);
    in >> obj.m_weight;
    return in;
}
int main ()
{
    char* name[7] = {"Apple", "Kiwi", "Lemon", "Grapes", "Lime", "Melon", "Banana"};
    char* color [7] = {"Red", "Brown", "Yellow", "Blue", "Green", "Yellow", "Yellow"};
    int weight [7] = {250, 100, 250, 450, 200, 1000, 350};
    char filename [20];
    cout << "Enter file name -> ";
    cin >> filename;
    fstream myFile (filename, ios_base :: out | ios_base :: binary | ios_base :: trunc);
    if (!myFile)
        return 1;
    for (int i(0); i < 7; i++)
    {
        CFruit *fruit = new CFruit (name[i], color[i], weight [i]);
        myFile << *fruit;
        delete fruit;
    }
    myFile.close ();
    myFile.open (filename, ios_base :: binary | ios_base :: in);
    if (!myFile)
        return 1;
    while (!myFile.eof ())
    {
        CFruit *fruit = new CFruit();
        myFile >> *fruit;
        if (!myFile.eof ())
            cout << *fruit << endl;
        delete fruit;
    }
    myFile.close ();
    return 0;
}
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.04.2014, 21:08     Из файла необходимо прочитать записи, установить ключи, позиции и количество записей #10
Код в main() нормально работает?
Lahden
1 / 1 / 0
Регистрация: 26.09.2013
Сообщений: 52
23.04.2014, 21:09  [ТС]     Из файла необходимо прочитать записи, установить ключи, позиции и количество записей #11
Да, и записывает, и читает корректно
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.04.2014, 21:16     Из файла необходимо прочитать записи, установить ключи, позиции и количество записей #12
Тогда показывайте "MyFile.h" и "Fruit.h".
Lahden
1 / 1 / 0
Регистрация: 26.09.2013
Сообщений: 52
23.04.2014, 21:29  [ТС]     Из файла необходимо прочитать записи, установить ключи, позиции и количество записей #13
СFruit.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#pragma once
#include "FileCard.h"
#include "Fruit.h"
#include <fstream>
class CMyFile
{
    fstream m_f;
    char* m_name;
    CFileCard& m_a;
    CFruit& m_r;
    void setA ();
public:
    CMyFile ();
    ~CMyFile();
    bool add (const char*, const char*, int);
    bool del (const char*);
    CFruit* find (const char*);
    int getN () const;
    CFruit* getRec (int);
    bool open (const char*);
    void save ();
    double averageWeight (const char* color);
};
Fruit.h
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
#pragma once
#include <iostream>
using namespace std;
class CFruit
{
protected:
    char* m_name;
    char* m_color;
    int m_weight;
public:
    CFruit ();
    CFruit (const char*, const char*, int);
    CFruit (const CFruit&);
    virtual ~CFruit();
    void setName(const char*);
    void setColor(const char*);
    void setWeight(int);
    char* getName() const;
    char* getColor() const;
    int getWeight() const;
    bool checkKey (const char*);
    bool operator == (const char* color);
    friend ostream& operator << (ostream&, const CFruit&);
    friend istream& operator >> (istream&, CFruit&);
};
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.04.2014, 21:38     Из файла необходимо прочитать записи, установить ключи, позиции и количество записей #14
Вопрос по getRec()? Где, как используете, что неправильно работает?
Lahden
1 / 1 / 0
Регистрация: 26.09.2013
Сообщений: 52
23.04.2014, 21:45  [ТС]     Из файла необходимо прочитать записи, установить ключи, позиции и количество записей #15
Использую этот метод для функции view (находится в классе Меню), так же использую для функции find. Сначала ищу по индексу позицию, потом устанавливаю ее, после этого читаю, но именно здесь и возникает проблема. Когда прошелся отладчиком, увидел, что из m_f в m_r ничего не записывается, хотя должно.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.04.2014, 21:50     Из файла необходимо прочитать записи, установить ключи, позиции и количество записей #16
Цитата Сообщение от Lahden Посмотреть сообщение
Использую этот метод для функции view (находится в классе Меню), так же использую для функции find. Сначала ищу по индексу позицию, потом устанавливаю ее, после этого читаю, но именно здесь и возникает проблема. Когда прошелся отладчиком, увидел, что из m_f в m_r ничего не записывается, хотя должно.
Код в main() не имеет никакого отношения к коду, в котором вы пытаетесь разобраться (непонятно для чего вы вообще его выложили). Вы можете отладчиком пройтись, а мне чем и где пройтись?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.04.2014, 16:12     Из файла необходимо прочитать записи, установить ключи, позиции и количество записей
Еще ссылки по теме:

C++ Прочитать из файла
Считывание из файла с заданной позиции C++
Прочитать строку из файла, разделить слова и вывести количество символов C++

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

Или воспользуйтесь поиском по форуму:
Lahden
1 / 1 / 0
Регистрация: 26.09.2013
Сообщений: 52
24.04.2014, 16:12  [ТС]     Из файла необходимо прочитать записи, установить ключи, позиции и количество записей #17
Вот функция view
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void CMenu :: view () const
{
 
    int n(m_ctrl -> getN());
    if (!n)
    {
        cout << "Objects not found" << endl;
        return;
    }
    CFruit* fruit;
    int i(0);
    while (i<n)
    {
        fruit = m_ctrl -> getRec (i);
        cout << *(fruit) << endl;;
        i++;
    }
}
а find есть на предыдущей странице.

Добавлено через 1 минуту
Пересматриваю эту программу уже не первый раз и никак не могу понять, что же не так, уже и перегрузки проверил, и функции, но хоть какую-то зацепку не нашел

Добавлено через 18 часов 17 минут
Может кому пригодится: проблема была в функции open, после setA нужен m_f.clear(), чтобы убрать признак конца файла, из-за которого и не возвращалась запись
Yandex
Объявления
24.04.2014, 16:12     Из файла необходимо прочитать записи, установить ключи, позиции и количество записей
Ответ Создать тему
Опции темы

Текущее время: 06:46. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru