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

Из файла записать данные в структуру данных - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
SKS-65
5 / 5 / 1
Регистрация: 18.10.2011
Сообщений: 187
03.07.2013, 07:06     Из файла записать данные в структуру данных #1
Скажите пожалуйста, как можно из файла записать данные в структуру данных? Я пробую fread, он не так работает

Добавлено через 15 минут
Со считывание разобрался, а можете помочь с тем чтобы данные записывать в разные элементы структуры
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.07.2013, 07:06     Из файла записать данные в структуру данных
Посмотрите здесь:

C++ как правильно считать (записать) структуру из файла
C++ Записать данные в начало файла
записать данные из файла в матрицу C++
Считывание данных из файла в структуру C++
Ввод данных в структуру из файла C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Praktolock
 Аватар для Praktolock
58 / 58 / 0
Регистрация: 29.11.2011
Сообщений: 272
03.07.2013, 07:39     Из файла записать данные в структуру данных #2
какие данные в какие элементы тебе надо записать

Добавлено через 11 секунд
хоть кода кусок покажи
SKS-65
5 / 5 / 1
Регистрация: 18.10.2011
Сообщений: 187
03.07.2013, 07:56  [ТС]     Из файла записать данные в структуру данных #3
Структура данных бинарное дерево, а данные 7 полей: 4 строки и 3 числа, я вот так сделал, ещё не проверял правильно ли работает, надо писать метод по выводу дерева, и тут тоже возник вопрос, как упорядоченно по ключу вывести
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
void TKartoteka::LoadIntoTheFile(TKartoteka* ptr)
{
    BinaryTree* np=new BinaryTree();
    char fname[]="C://MyFile.txt";
    FILE* f;
    
    f=fopen(fname,"rt");
while (!feof(f))
{
    fscanf(f, "%s %s %s %s %d %d %d ", np->TitleComposition, np->Executor, np->TitleAlbum, np->Genre, &np->Year, &np->Duration, &np->ID);
    if (!ptr->pRoot)
        pRoot=np;
    else
    {
        BinaryTree* pCur=pRoot;
        BinaryTree* pPrev;
        bool left;
        do
        {
            pPrev=pCur;
            if(np->ID<pCur->ID)
            {
                pCur=pCur->left;
                left=true;
            }
            else
            {
                pCur=pCur->right;
                left=false;
            }
        }while(pCur);
        if (left)
            pPrev->left=np;
        else
            pPrev->right=np;
    }
}
        fclose(f);
}
Praktolock
 Аватар для Praktolock
58 / 58 / 0
Регистрация: 29.11.2011
Сообщений: 272
03.07.2013, 08:15     Из файла записать данные в структуру данных #4
Исполнитель - экзекутор? (хорошая шутка) Покажи больше кода - какие данные-члены у тебя в классах TKartotera и BinaryTree. А какой член узла дерева у тебя играет роль ключа?
Зачем ты в TKartoteka::TKartoteka передаешь указатель?
SKS-65
5 / 5 / 1
Регистрация: 18.10.2011
Сообщений: 187
03.07.2013, 08:20  [ТС]     Из файла записать данные в структуру данных #5
Цитата Сообщение от Praktolock Посмотреть сообщение
Зачем ты в TKartoteka::TKartoteka передаешь указатель?
Не хватило ума, как по другому написать)
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
class TKartoteka
{
private:
    struct BinaryTree
    {
        char TitleComposition [30];
        char TitleAlbum [30];
        char Executor [30];
        char Genre[30];
        int Year;
        int Duration;
        long int ID;
        short num;
        long int GenerationID();
        void PrintEl();
        BinaryTree* left;
        BinaryTree* right;
 
BinaryTree()
{
    ID=GenerationID();
    strcpy(this->TitleComposition, "");
    strcpy(this->TitleAlbum, "");
    strcpy(this->Executor, "");
    this->Year=0;
    strcpy(this->Genre, "");
    this->Duration=0;
    this->num=0;
    this->left=NULL;
    this->right=NULL;
}
    };
    BinaryTree* pRoot;//корневой
public:
    TKartoteka(){pRoot=NULL;}
    
    void SortPrint(BinaryTree* ptr);
    void LoadIntoTheFile(TKartoteka* ptr);
};
Praktolock
 Аватар для Praktolock
58 / 58 / 0
Регистрация: 29.11.2011
Сообщений: 272
03.07.2013, 08:31     Из файла записать данные в структуру данных #6
Цитата Сообщение от SKS-65 Посмотреть сообщение
Не хватило ума, как по другому написать)
просто void TKartoteka::TKartoteka(){...};
Функции члену передаётся секретный указатель this на экземпляр класса в рамках которого вызван метод, т.е. всемто ptr->какой-точленилифункция можно написать this->какой-точленилифункция, а еще проще просто какой-точленилифункция, безо всяких указателей. Я серьёзно, для обращения к членам данного экземпляра класса в функциях членах никаких указателей не нужно, если только функция не static.
Теперь по порядку

Добавлено через 6 минут
функции strcpy нужен указатель на строку. Вместо:
C++
1
strcpy(this->TitleComposition, "");
нужно писать примерно так:
C++
1
strcpy(&TitleComposition[0], "");
т.е. передаём ей указатель на первый элемент массива. И опять же никаких указателей на экземпляр класса без this прекрасно всё будет работать
SKS-65
5 / 5 / 1
Регистрация: 18.10.2011
Сообщений: 187
03.07.2013, 08:34  [ТС]     Из файла записать данные в структуру данных #7
Глупый может вопрос, но всё же спрошу потому что не понимаю, какого массива? у нас же дерево
Praktolock
 Аватар для Praktolock
58 / 58 / 0
Регистрация: 29.11.2011
Сообщений: 272
03.07.2013, 08:35     Из файла записать данные в структуру данных #8
хотя... я не понял как задумывался у тебя класс картотека. BinaryTree() - это конструктор структуры BInaryTree? Или "просто член" класса TKartoteka?

Добавлено через 1 минуту
строка - это массив символов.
C++
1
char TitleComposition [30];
это объявление массива из char'ов
SKS-65
5 / 5 / 1
Регистрация: 18.10.2011
Сообщений: 187
03.07.2013, 08:37  [ТС]     Из файла записать данные в структуру данных #9
Конструктор структуры
BinaryTree это как отдельный элемент дерева, узел, а TKartoteka это само дерево
Praktolock
 Аватар для Praktolock
58 / 58 / 0
Регистрация: 29.11.2011
Сообщений: 272
03.07.2013, 08:43     Из файла записать данные в структуру данных #10
давай немного модифицируем класс вот примерно таким образом:
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
class TKartoteka
{
private:
    struct BinaryTree
    {
        char TitleComposition [30];
        char TitleAlbum [30];
        char Executor [30];
        char Genre[30];
        int Year;
        int Duration;
        long int ID;
        short num;
        long int GenerationID();
        void PrintEl();
        BinaryTree* left;
        BinaryTree* right;
        BinaryTree()
        {
            ID=GenerationID();
            strcpy(&TitleComposition[0], "");
            strcpy(&TitleAlbum[0], "");
            strcpy(&Executor[0], "");
            Year=0;
            strcpy(&Genre[0], "");
            Duration=0;
            num=0;
            left =NULL;
            right=NULL;
        };
    }pRoot*;//
    void LoadFromFile();//мне кажеться логичнее from а не to (-:
    void SortPrint();
};
SKS-65
5 / 5 / 1
Регистрация: 18.10.2011
Сообщений: 187
03.07.2013, 08:49  [ТС]     Из файла записать данные в структуру данных #11
Цитата Сообщение от Praktolock Посмотреть сообщение
мне кажеться логичнее from а не to (-:
)там просто до этого Save был, не исправил,
Praktolock
 Аватар для Praktolock
58 / 58 / 0
Регистрация: 29.11.2011
Сообщений: 272
03.07.2013, 08:50     Из файла записать данные в структуру данных #12
Нестрашо . Я накосячил немного, там вместо pRoot* естественно *pRoot - не могу отредактировать пост сейчас
SKS-65
5 / 5 / 1
Регистрация: 18.10.2011
Сообщений: 187
03.07.2013, 08:51  [ТС]     Из файла записать данные в структуру данных #13
А метод вывода на экран (SortPrint()) он же рекурсивный должен быть, разве нет?
Praktolock
 Аватар для Praktolock
58 / 58 / 0
Регистрация: 29.11.2011
Сообщений: 272
03.07.2013, 08:53     Из файла записать данные в структуру данных #14
Да, именно таким он и должен быть
SKS-65
5 / 5 / 1
Регистрация: 18.10.2011
Сообщений: 187
03.07.2013, 08:58  [ТС]     Из файла записать данные в структуру данных #15
Тогда получается
C++
1
void SortPrint(BinaryTree* ptr)
А в функции мэйн, когда объявляем объект TKartoteka* ptr=new TKartoteka();, какой объект структуры нужно передавать?
Praktolock
 Аватар для Praktolock
58 / 58 / 0
Регистрация: 29.11.2011
Сообщений: 272
03.07.2013, 09:02     Из файла записать данные в структуру данных #16
Попробую ответить на вопрос, как я его понял. В мейне у тебя будет примерно так:
C++
1
2
3
TKartoteka* ptr=new TKartoteka();
ptr->LoadFromFile();
ptr->SortPrint();
Ничего никуда передавать не нужно
SKS-65
5 / 5 / 1
Регистрация: 18.10.2011
Сообщений: 187
03.07.2013, 09:10  [ТС]     Из файла записать данные в структуру данных #17
А как тогда реализовывать SortPrint() чтобы метод был рекурсивный, объект структуры будет
C++
1
this->pRoot
?
Praktolock
 Аватар для Praktolock
58 / 58 / 0
Регистрация: 29.11.2011
Сообщений: 272
03.07.2013, 09:23     Из файла записать данные в структуру данных #18
2 варианта: можно в струкуру дерева добваить метод SortPrint. Выглядеть он будет примерно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void TKartoteka::BinaryTree::SortPrint()
{
 //какието действия
 if(/*некое условие*/)
 {
  left->SortPrint();
 }
 //какието действия
 if(/*некое условие*/)
 {
  right->SortPrint();
 }
 //чтонибуть там еще
};
Добавлено через 2 минуты
Ну и соответственно вызывать её из TKartoteka::SortPrint примерно так:
C++
1
2
3
4
TKartoteka::SortPrint()
{
 pRoot->SortPrint();
};
Добавлено через 2 минуты
Либо можно крутить рекурсию на функции TKartoteka::SortPrint, правда ей уже, в таком случае, и впрямь придётся передавать указатель на узел дерева примерно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
TKartoteka::SortPrint(BinaryTree*pTree)
{
 //какието действия
 if(/*некое условие*/)
 {
  SortPrint(left);
 }
 //какието действия
 if(/*некое условие*/)
 {
  SortPrint(right);
 }
 //чтонибуть там еще
};
Добавлено через 2 минуты
можно перегрузить функцию SortPrint сделав два варианта с разными параметрами, например TKartoteka::SortPrint() будет вызывать TKartoteka SortPrint(BinaryTree*) передавая ей свой pRoot
SKS-65
5 / 5 / 1
Регистрация: 18.10.2011
Сообщений: 187
03.07.2013, 09:42  [ТС]     Из файла записать данные в структуру данных #19
Наверное так и сделаю. А с считыванием из файла что делать, я вот то что написал, а по другому нет идей

Добавлено через 12 минут
И ещё вопрос, как можно упорядоченно вывести элементы, то есть если вот так
C++
1
2
3
4
if (!ptr) return;
    SortPrint(ptr->left);
    cout << ptr->TitleComposition << " " << ptr->Executor << " " << ptr->TitleAlbum << "\n";
    SortPrint(ptr->right);
то это просто вывод, а как их ещё упорядочить по ключи, или это вообще лучше делать при записи?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.07.2013, 10:07     Из файла записать данные в структуру данных
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Praktolock
 Аватар для Praktolock
58 / 58 / 0
Регистрация: 29.11.2011
Сообщений: 272
03.07.2013, 10:07     Из файла записать данные в структуру данных #20
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
class TKartoteka
{
private:
    struct BinaryTree
    {
        char TitleComposition [30];
        char TitleAlbum [30];
        char Executor [30];
        char Genre[30];
        int Year;
        int Duration;
        long int ID;
        short num;
        long int GenerationID(){return(strlen(&TitleComposition[0]));};// ololo
        void PrintEl();
        BinaryTree* left;
        BinaryTree* right;
        BinaryTree(){ZeroMemory(this, sizeof(BinaryTree));};//проще обнулить все чем присваить каждому члену ноль
    }*pRoot;//надаже и данные каките добавить в класс кроме обьявлений структур и прочего
    void LoadFromFile();//мне кажеться логичнее from а не to (-:
    void SortPrint();
public:
 TKartoteka(){ZeroMemory(this, sizeof(TKartoteka));};
};
 
 
void TKartoteka::LoadFromFile()
{
 char fname[]="C://MyFile.txt";
 FILE* f;
    
 f=fopen(fname,"rt");
 while (!feof(f))
 {
  BinaryTree*np=new BinaryTree();
  fscanf(f, "%s %s %s %s %d %d %d ", np->TitleComposition, np->Executor, np->TitleAlbum, np->Genre, &np->Year, &np->Duration, &np->ID);
  if(!pRoot)//если картотека пустая значит это первая запись из файла 
  {
   pRoot=np;//и она будет корнем
  }
  else
  {
   BinaryTree*pCur=pRoot;//начинаем обход дерева с корня
someloop:
   if(pCur->ID<np->ID)//значит нужно влево
   {
    if(pCur->left)//слева уже есть дерево?
    {
     pCur=pCur->left;
     goto someloop;
    }
    else          //ах нету? значит будет
    {
     pCur->left=np;
    };
   }
   else            //или вправо
   {  
    if(pCur->right)//справа уже есть дерево?
    {
     pCur=pCur->right;
     goto someloop;
    }
    else          //ах нету? значит будет
    {
     pCur->right=np;
    };
   };
  };
  fclose(f);
 }
};
 
 
int main()
{
 TKartoteka kart;
 kart.LoadFromFile();
  _getch();
    return 0;
}
Я не тестировал, попробуй - работает/нет?

Добавлено через 44 секунды
ваще жуть если честно, обход дерева нужно тоже рекурсией делать, я поленился

Добавлено через 9 минут
fclose(а) за одну скобку переместить надо. Нестерпел, захотелось позапускать)
Yandex
Объявления
03.07.2013, 10:07     Из файла записать данные в структуру данных
Ответ Создать тему
Опции темы

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