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

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

Войти
Регистрация
Восстановить пароль
 
 
Lahden
1 / 1 / 0
Регистрация: 26.09.2013
Сообщений: 52
#1

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

20.04.2014, 18:26. Просмотров 351. Ответов 16
Метки нет (Все метки)

Из файла необходимо прочитать записи, установить ключи, позиции и количество записей
это делаю вот так
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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.04.2014, 18:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Из файла необходимо прочитать записи, установить ключи, позиции и количество записей (C++):

Прочитать файл в обратном порядке т.е. встать в конец файла и прочитать до начальной позиции - C++
подскажите пожалуйста как можно прочитать файл в обратном порядке т.е. стать в конец файла и прочитать до начальной позиции?

Прочитать данные из файла в матрицу с указанной позиции - C++
"дата 16.09.03 время 0:03:28 число точек 6144 частота 0616000 станция радиостация дискретность 50 Ф.И.О. оператора калибровка...

Копировать из файла заданное количество символов, начиная с заданной позиции - C++ - C++
Программа должна копировать символы с начала файла Dat.txt и к введенной с клавиатуры позиции1 (pos). Затем копировать с позиции2 (kil) до...

Прочитать строку из файла, разделить слова и вывести количество символов - C++
Написал программу, которая должна прочитать строку из файла, разделить слова и вывести количество символов. Программа работает, но она...

как прочитать строку из файла с заданой позиции - C#
Подскажите как прочитать строку из файла с заданой позиции или как прочитать конкретную строку из файла?

Необходимо прочитать из файла - JavaScript
У меня на сайте есть поддержка php, но мне нужно чтобы на html было реализовано чтение из файла и вывод на страницу. Просто я немогу...

16
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.04.2014, 20:04 #2
Что за данные в файле, и как они туда записывались?
0
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 ();
0
alsav22
5425 / 4820 / 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;
}
0
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;
}
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.04.2014, 02:16 #6
Цитата Сообщение от Lahden Посмотреть сообщение
Реализация
Где здесь что-то бинарное? Зачем пишите?
Цитата Сообщение от Lahden Посмотреть сообщение
Файл бинарный
Весь код показывайте. В выложенных кусках ошибок не вижу.
0
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];
}
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.04.2014, 20:13 #8
И где здесь то, что во 2, 3, 5 постах?
0
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;
}
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.04.2014, 21:08 #10
Код в main() нормально работает?
0
Lahden
1 / 1 / 0
Регистрация: 26.09.2013
Сообщений: 52
23.04.2014, 21:09  [ТС] #11
Да, и записывает, и читает корректно
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.04.2014, 21:16 #12
Тогда показывайте "MyFile.h" и "Fruit.h".
0
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&);
};
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.04.2014, 21:38 #14
Вопрос по getRec()? Где, как используете, что неправильно работает?
0
Lahden
1 / 1 / 0
Регистрация: 26.09.2013
Сообщений: 52
23.04.2014, 21:45  [ТС] #15
Использую этот метод для функции view (находится в классе Меню), так же использую для функции find. Сначала ищу по индексу позицию, потом устанавливаю ее, после этого читаю, но именно здесь и возникает проблема. Когда прошелся отладчиком, увидел, что из m_f в m_r ничего не записывается, хотя должно.
0
23.04.2014, 21:45
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.04.2014, 21:45
Привет! Вот еще темы с ответами:

Необходимо открыть файл для записи и чтения, прочитать инфу изменить и записать. - PHP
Подскажите начинающему плиз. собственно необходимо открыть файл для записи и чтения, прочитать инфу изменить и записать. ...

Необходимо прочитать название файла - VBA
Есть каталог с файлами 111.txt, 222.txt и тд . Необходимо прочитать название файлов и записать данные в Excell.

Необходимо с каждого файла прочитать строку - Delphi
Здравствуйте! Помогите решить такую задачу. Есть каталог Vedomosti (в нём ещё несколько каталогов 1,2,3,4,5,6,7,8,9,10) в них...

Прочитать элементы записи из текстового файла - Pascal ABC
У меня есть файл, в котором хранится данные разного типа( цифры и слова) разделены они пробелом и переходом на новую строку, то есть: ...


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

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

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