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

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

Войти
Регистрация
Восстановить пароль
 
Valentina
68 / 68 / 3
Регистрация: 13.05.2012
Сообщений: 130
#1

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

02.08.2013, 19:22. Просмотров 401. Ответов 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
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++
#include&lt;iostream&gt; #include&lt;fstream&gt; #include&lt;locale.h&gt; #include&lt;iomanip&gt; #include &lt;cstdlib&gt; using namespace std; struct...

Чтение нескольких структур и одной переменной из бинарного файла. Формат файла имеется - C++
Формат файла состоит из 3 структур и одной переменной. Подробное описание формата во вложении, просьба посмотреть его. У меня возникла...

как может корректно выполняющийся оператор >> (чтение из текстового файла) негативно влиять на открытие другого файла? - C++
Друзья! Создадим два текстовых файла, f_0.txt и f_1.txt и что-нибудь в них запизаем, например в первый запихаем 1234 а во второй 5678 и...

Чтение файла с несколькими знаками конца файла - C++
В файле несколько раз встречается ноль, и ни как не получается прочитать его полностью. Как можно решить данную проблему ?

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
alsav22
5417 / 4813 / 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
5417 / 4813 / 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";
  }
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.08.2013, 21:00
Привет! Вот еще темы с ответами:

Чтение из файла на C - C++
Имеется текстовый файл, в нём заданы числа (примерно такого вида: 40 30 66 1 132 и т.д.), числа можно записать и построчно (в каждой строке...

чтение из файла - C++
Задача состоит в том,чтобы считать данные из файла,который содержит только целые числа со знаком,записать их в массив и вывести в консоль. ...

чтение файла - C++
как прочитать файл в динамический массив? для обычного я делал так: char S ; file.Read (S, 300); теперь S - динамический...

чтение из файла - C++
Доброго времени суток! У меня возникла проблема, касающаяся вывода данных из файла. Не могу понять, с чем это связано void...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
02.08.2013, 21:00
Ответ Создать тему
Опции темы

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