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

чтение из файла - C++

Восстановить пароль Регистрация
 
Valentina
66 / 66 / 3
Регистрация: 13.05.2012
Сообщений: 130
02.08.2013, 19:22     чтение из файла #1
помогите, пожалуйста, найти ошибку. При вводе данных о двух работниках, запись их в файл происходит нормально, а от чтение выдает ошибку((
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
#include <fstream>        // для файлового ввода/вывода
#include <iostream>
using namespace std;
 
const int len=32;
const int maxen=100;
 
class name{
private:
  unsigned long number;
  char imia[len];  
  char sername[len]; 
  char familia[len];
  static int n;
  static name* arrap[];
public:
    
    void set_info()
    {
        cin.ignore(10,'\n');
        cout<<"Введите имя работника: "<<endl;
     cin>> imia ;
     cout<<"Введите отчество: "<<endl;
     cin>> sername ;
     cout<<"Введите фамилию: "<<endl;
     cin>> familia ;
     cout<<"Введите номер работника: "<<endl;
     cin>> number ;
    }
    void get_info()
    {
  cout<<"имя работника: "<<endl<<imia<<endl
      <<"отчество: "<<endl<<sername<<endl
      <<"фамилия: "<<endl<<familia<<endl
      <<"номер работника: "<<endl<<number<<endl;
  }
    static void add();
    static void display();
    static void read();
    static void write();
  
 
};
int name::n;
name* name::arrap[maxen];
void name::add()
{
    arrap[n]=new name;
    arrap[n++]->set_info();
}
void name::display()
{
    for(int j=0;j<n;j++)
    {
        cout<<(j+1);
        cout<<"Работник: "<<endl;
        arrap[j]->get_info();
        cout<<endl;
    }
}
//Записать все объекты, хранящиеся в памяти, в файл
void name::write()
  {
  int size;
  name na;
  cout << "Идет запись " << n << " работников.\n";
  ofstream ouf;           // открыть ofstream в двоичном виде
  
 
  ouf.open("EMPLOY.txt", ios::app | ios::binary);
  if(!ouf)
    { cout << "\nНевозможно открыть файл\n"; return; }
  
    
    ouf.write( (char*)&na, sizeof(na) );
    for(int j=0; j<n; j++)  
       ouf.write( (char*)(arrap[j]), sizeof(name) );
    if(!ouf)
      { cout << "\nЗапись в файл невозможна\n"; return; }
}
  
//---------------------------------------------------------
//чтение всех данных из файла в память
void name::read()
  {
  int size;               // размер объекта employee 
  name na;
  ifstream inf;           // открыть ifstream в двоичном виде
  inf.open("EMPLOY.txt", ios::binary);
  if(!inf)
    { cout << "\nНевозможно открыть файл\n"; return; }
  n = 0;                  // В памяти работников нет
  while(true)
    {                     // чтение типа следующего работника
    inf.read( (char*)&na, sizeof(na) );
    if( inf.eof() )       // выход из цикла по EOF
      break;
    if(!inf)              // ошибка чтения типа
      { cout << "\nНевозможно чтение типа\n"; return; }
        arrap[n] = new name;
    inf.read( (char*)arrap[n], sizeof(name)  );
    if(!inf)              // ошибка, но не EOF
      { cout << "\nЧтение данных из файла невозможно\n"; return; }
    n++;                  // счетчик работников увеличить
    }  //end while
  cout << "Идет чтение " << n << " работников\n";
  }
///////////////////////////////////////////////////////////
 
 
 
int main()
{
    setlocale (LC_CTYPE,"rus");
    char ch;
  while(true)
    {
    cout << "'a' – добавление сведений о работнике"
          <<"\n'd' - вывести сведения обо всех работниках"
          <<"\n'w' – записать все данные в файл"
          <<"\n'r' – прочитать все данные из файла"
          <<"\n'x' - выход"
          <<"\nВаш выбор: ";
    cin >> ch;
    switch(ch)
      {
      case 'a':           // добавить работника
        name::add(); break;
      case 'd':           // вывести все сведения
        name::display(); break;
      case 'w':           // запись в файл
        name::write(); break;
      case 'r':           // чтение всех данных из файла
        name::read(); break;
      case 'x': exit(0);  // выход
      default: cout << "\nНеизвестная команда";
      }  //end switch
    }  //end while
system ("pause");
return 0;
    }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.08.2013, 19:22     чтение из файла
Посмотрите здесь:

C++ Чтение из файла.
Чтение из файла C++
C++ Чтение файла
C++ Чтение из файла
Чтение из файла C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.08.2013, 20:51     чтение из файла #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//чтение всех данных из файла в память
void name::read()
  {
  int size;               // размер объекта employee 
  name na;
  ifstream inf;           // открыть ifstream в двоичном виде
  inf.open("EMPLOY.txt", ios::binary);
  if(!inf)
    { cout << "\nНевозможно открыть файл\n"; return; }
  n = 0;                  // В памяти работников нет
  
  inf.read( (char*)&na, sizeof(na) );// чтение типа следующего работника
  while(true)
    {                     
        arrap[n] = new name;
        inf.read( (char*)arrap[n], sizeof(name)  );
        if (inf.eof()) break;
        if(!inf)              // ошибка, но не EOF
        { cout << "\nЧтение данных из файла невозможно\n"; return; }
        n++;                  // счетчик работников увеличить
     }  //end while
     cout << "Идет чтение " << n << " работников\n";
  }
Pakisan
14 / 14 / 1
Регистрация: 04.01.2013
Сообщений: 61
02.08.2013, 20:52     чтение из файла #3
Меня смущает то, что вы приводите name к (char*) и после этого пишете в файл. Не нужно так.
C++
1
2
3
stream.write(name.name, strlen(name.name);
...
stream<<"some divider";
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.08.2013, 21:00     чтение из файла #4
Но лучше, наверное, так (там память до считывания выделяется, будет утечка):
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
//чтение всех данных из файла в память
void name::read()
  {
  int size;               // размер объекта employee 
  name na;
  ifstream inf;           // открыть ifstream в двоичном виде
  inf.open("EMPLOY.txt", ios::binary);
  if(!inf)
    { cout << "\nНевозможно открыть файл\n"; return; }
  n = 0;                  // В памяти работников нет
  
  inf.read( (char*)&na, sizeof(na) );// чтение типа следующего работника
  while(true)
    {                     
        arrap[n] = new name;
        inf.read( (char*)arrap[n], sizeof(name)  );
        if (inf.eof())
        {
            delete arrap[n]; 
            break;
        }
        if(!inf)              // ошибка, но не EOF
        { 
            cout << "\nЧтение данных из файла невозможно\n";
            delete arrap[n];
            return; 
        }
        n++;                 // счетчик работников увеличить
     }  //end while
     cout << "Идет чтение " << n << " работников\n";
  }
Yandex
Объявления
02.08.2013, 21:00     чтение из файла
Ответ Создать тему
Опции темы

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