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

Считать структуру из файла - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.95
vaselo
19 / 19 / 1
Регистрация: 17.10.2010
Сообщений: 247
15.03.2011, 17:42     Считать структуру из файла #1
Сохраняю динамическую структуру в файл, записывается поле, переходит на новую строчку, снова записывает. как теперь из этого файла считать дин. структуру? нужно через поток
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int save(stud* first)
{
    char fname [80];
    if (first==0) {cout<<"Пусто";Sleep(500);return -1;}
    cout<<"Введите имя (путь) к файлу: \n";
    cin>>fname;
        ofstream ofs(fname);
        do  {
            ofs<<first->name<<endl;
            if(first->next==NULL) break;
            else first=first->next;
            }while(first->next);
        ofs.close();
    return 0;
}
 Комментарий модератора 
Именуйте темы осмысленно. Название темы должно максимально полно отражать ее содержание.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
IrineK
Заблокирован
15.03.2011, 19:15     Считать структуру из файла #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
ifstream dataIn;
stud Cur;
    dataIn.open("Some.dat");
    if(dataIn.is_open())
    {   while(dataIn.good())
        {   dataIn.read((char *)&Cur,sizeof(stud));
            .............
            
            
        }
        dataIn.close();
    }
    else cout<<"Не удалось открыть файл для чтения\n";
vaselo
19 / 19 / 1
Регистрация: 17.10.2010
Сообщений: 247
15.03.2011, 20:36  [ТС]     Считать структуру из файла #3
Пожалуйста без критики, но моя read(first) неправильно читает( выводит ММММ)
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
#include "stdafx.h"
#include <stdio.h>
#include <Windows.h>
#include <iostream>
#include <fstream>
using namespace std;
 
struct stud {
    char name[36];
    stud* next;
};
 
int save(stud* first)
{
    char fname [80];
    if (first==0) {cout<<"Пусто";Sleep(500);return -1;}
    cout<<"Введите имя (путь) к файлу: \n";
    cin>>fname;
        ofstream ofs(fname);
        do  {
            ofs<<first->name<<endl;
            if(first->next==NULL) break;
            else first=first->next;
            }while(first->next);
        ofs.close();
    return 0;
}
void read(stud* &first)
{
    ifstream dataIn;
    char fname [80];
    stud Cur;
    stud* p;
    cout<<"Введите имя (путь) к файлу: \n";
    cin>>fname;
    dataIn.open(fname);
            if(dataIn.is_open())
            {       while(dataIn.good())
                    {       dataIn.read((char *)&Cur,sizeof(stud));
                            p=new stud;
                            p=&Cur;
                            p->next=first;
                            first=p;
                    }
                    dataIn.close();
            }
            else cout<<"Не удалось открыть файл для чтения\n";
}
void search (stud* first)
{
    char name[36];
    int i=1;
    if(first==NULL){cout<<"Пусто\n"; Sleep(1000); return;}
    cout<<"Введите имя искомого студента >";
    cin>>name;
    do  {if(strcmp(name,first->name)) 
            {cout<<i+1<<"-й номер в списке\n"; Sleep(1000); return;}
        else {
                i++;
                first=first->next;
             }
        }while(first->next);
    cout<<"Нет такого студента\n";Sleep(1000);
    return;
}
void adding(stud* &first){
    system ("CLS");
    stud *p=new stud;
    cout<<"\nВведите имя студента: ";
    cin>>p->name;
    p->next=first;
    first=p;
}
void deleting(stud* &first)
 {
    if(first==NULL){cout<<"Уже пуcто\n"; Sleep(300); return;}
    if(first->next==NULL){
        delete first;
        first=NULL;
        return;
    }
    stud* tmp=first;
    while(tmp->next->next){
        tmp=tmp->next;
    }
    delete tmp->next;
    tmp->next=NULL;
    return;
}
void delling(stud* &first)
{
    if(first==NULL){cout<<"Уже пусто\n"; Sleep(200); return;}
    if(first->next==NULL){
        delete first;
        first=NULL;
        return;
    }
    system ("CLS");
while(first->next)
    deleting(first);
    deleting(first);
    return;
}
void empty(stud* first)
{
  int i=0;
  if(first==NULL)
    {
        cout<<"Очередь пуста"<<endl;
        Sleep(500);
    }
    else
        {
        while(first->next){
            i++;
            first->next;
        }
        cout<<"\nВ очереди "<<i+1<<" элементов"<<endl;
        Sleep(1000);
        }
  return;
}
 void show(stud* first)
 { if(first==NULL){cout<<"Пусто\n"; Sleep(200); return;}
    system ("CLS");
    
    if(first->next==0) {cout<<endl<<first->name;  Sleep(4000); return;}
    else {while(first->next)
        {
            cout<<endl<<first->name;
            first=first->next;
        }}
    if(first->next==0) cout<<endl<<first->name;
    cout<<endl;
    system("pause");
 }
 int main()
{setlocale(LC_ALL, "Russian");
    stud* first=NULL;
    int sw;
    while(1)
    {
        system ("CLS");
        cout<<"1. Добавить студента в список\n"<<"2. Удалить из списка\n";
        cout<<"3. Проверить список на пустоту\n"<<"4. Поиск"<<endl<<"5. Очистить очередь"<<endl<<"0. Выход"<<endl<<"6. Показать список"<<endl<<endl<<"Сделайте свой выбор\n>";
        cin>>sw;
        switch(sw)
        {
            case 1: adding(first); break;
            case 2: deleting(first); break;
            case 3: empty(first); break;
            case 4: search(first); break;
            case 5: delling(first); break;
            case 6: show(first);break;
            case 7: save(first);break;
            case 8: read(first);break;
            case 0: return 0; break;
        }
    }
}
Добавлено через 31 минуту
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void read(stud* &first)
{
    ifstream dataIn;
    char fname [80];
    stud Cur;
    stud* p;
    cout<<"Введите имя (путь) к файлу: \n";
    cin>>fname;
    dataIn.open(fname);
            if(dataIn.is_open())
            {       while(dataIn.good())
            {       dataIn.read((char *)&Cur.name,sizeof(stud));
                            p=new stud;
                            cout<<p->name<<" ";
                            p=&Cur;
                            p->next=first;
                            first=p;
                    }system("pause");
                    dataIn.close();
            }
            else cout<<"Не удалось открыть файл для чтения\n";
}
bigredcat
364 / 311 / 3
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
15.03.2011, 21:07     Считать структуру из файла #4
Да, я смотрю у вас еще и save не сохраняет первый элемент
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int save(stud* first)
{
    char fname [80];
    if (first==0) {cout<<"Пусто";Sleep(500);return -1;}
    cout<<"Введите имя (путь) к файлу: \n";
    cin>>fname;
    ofstream ofs(fname);
    do
    {
        ofs << first->name << endl;
 
        // Эти проверки здесь не нужны, все проверяется в while.
//      if(first->next==NULL) break;
//      else first=first->next;
 
        first = first->next;
    }
//  while(first->next); // Если следующий NULL, то вы и текущий не добавите. Вы же уже сделали first = first->next
    // Проверяем текущий элемент, а не следующий!!!
    while(first);
    ofs.close();
    return 0;
}
vaselo
16.03.2011, 00:08  [ТС]
  #5

Не по теме:

ну помогитеееее есть весь текст программы - для отладки. ошибочная функция - read

accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
16.03.2011, 10:57     Считать структуру из файла #6
Цитата Сообщение от IrineK
C++
1
2
3
        if(dataIn.is_open())
        {       while(dataIn.good())
                {       dataIn.read((char *)&Cur,sizeof(stud));
пустой файл будет читаться, сломанный тоже (ошибка чтения первых символов)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <fstream>
 
using namespace std;
 
int main()
{
    ifstream dataIn("file.txt", ios::binary);
    struct stud { int n; };
    char Cur[10];
    
    if(dataIn.is_open())
        while(dataIn.good()) {
            dataIn.read((char *)&Cur,sizeof(stud));
            cout << "I have read" << endl;
            cout << Cur << endl;
        }
    
    return 0;
}
Код
[guest@localhost tests]$ .iso++ t.cpp -o t
[guest@localhost tests]$ ./t
[guest@localhost tests]$ touch file.txt
[guest@localhost tests]$ ./t
I have read
��
[guest@localhost tests]$
vaselo
16.03.2011, 12:05  [ТС]
  #7

Не по теме:

accept, спасибо большое. я сегодня проснулся, посетила мысль. прямо возле препода сел и сделал копирование 36 байт сразу в поле p.name и все заработало. все-же утро вечера мудренее!!!!

accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
17.03.2011, 04:03     Считать структуру из файла #8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <fstream>
#include <iomanip>
 
using namespace std;
 
int main()
{
    ifstream dataIn("file.txt", ios::binary);
    struct stud { int n; } Cur = { 0 };
    
    if(dataIn.is_open())
        while(dataIn.read((char *) &Cur, sizeof Cur)) {
            cout << "I have read" << endl;
            cout << hex << Cur.n << endl;
        }
    
    dataIn.close();
    
    return 0;
}
Код
[guest@localhost tests]$ .iso++ t.cpp -o t
[guest@localhost tests]$ hexdump -C file.txt
00000000  aa bb ff ff cc dd                                 |......|
00000006
[guest@localhost tests]$ ./t
I have read
ffffbbaa
[guest@localhost tests]$
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.03.2011, 04:19     Считать структуру из файла
Еще ссылки по теме:

как считать из файла структуру через разделитель? C++
Считать все слово из файла в структуру C++
C++ Считать с файла в структуру

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

Или воспользуйтесь поиском по форуму:
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
17.03.2011, 04:19     Считать структуру из файла #9
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <fstream>
#include <iomanip>
 
using namespace std;
 
int main()
{
    ifstream dataIn("file.txt", ios::binary);
    struct stud { int n; } Cur = { 0 };
    
    if(dataIn.is_open())
        while(dataIn.read((char *) &Cur, sizeof Cur)) {
            cout << "I have read" << endl;
            cout << hex << Cur.n << endl;
        }
    
    dataIn.close();
    
    return 0;
}
Код
[guest@localhost tests]$ .iso++ t.cpp -o t
[guest@localhost tests]$ hexdump -C file.txt
00000000  aa bb ff ff cc dd                                 |......|
00000006
[guest@localhost tests]$ ./t
I have read
ffffbbaa
[guest@localhost tests]$
Добавлено через 15 минут
вот здесь видно, что не только чтение из пустого файла не будет происходить, но и то, что не считалось в структуру, тоже не будет считаться прочитанной структурой
Yandex
Объявления
17.03.2011, 04:19     Считать структуру из файла
Ответ Создать тему
Опции темы

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