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

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

Войти
Регистрация
Восстановить пароль
 
 
o33ik
138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
#1

Ошибка при открытые файла - C++

14.12.2013, 00:57. Просмотров 924. Ответов 28
Метки нет (Все метки)

Ошибка при открытые файла. В файл запысывает нормально. Даже читает то что там есть(несколько обьектов) но после того как прочитает последний обьект, то ошибка, хз почему. Надо записать и прочитать обьекты класса Parts. В классе написал методы записи и чтения самы себя(взял с Лафоре). В autoRepair есть методы saveToFileParts и openFromFileParts. В проекте уже есть файлик который надо открыть(в нем два обьекта). Помогите мне пожалуста с етим, надо сдавать курсовую скоро, и только вот это не работает(
0
Вложения
Тип файла: 7z Kursak.7z (5.94 Мб, 7 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.12.2013, 00:57
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибка при открытые файла (C++):

Ошибка при вызове метода класса, при чтении из файла - C++
добрый день, пытаюсь считать данные из и запихнуть их в список в файле у меня вот такие данные a01 b10 А и Б надо запихнуть в...

Ошибка при чтении из файла - C++
Файл открывается, но читаться из него информация не хочется. Исходник int c_array :: save(char *path) { FILE *f; f =...

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

Ошибка при чтении файла - C++
Есть вот такой код: #include "stdafx.h" #include <iostream> #include <iomanip> #include <conio.h> #include <string.h> ...

Ошибка при открывании файла - C++
Здравствуйте, При создании проэкта вылетает ошибка, пересмотрел все, програма запускается Мне кажется проблема в этой функции void...

Ошибка при чтении файла - C++
Необработанное исключение по адресу 0x0FE4172C (msvcp140d.dll) в .exe: 0xC0000005: нарушение прав доступа при записи по адресу 0xCDCDCDCD. ...

28
o33ik
138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
14.12.2013, 23:37  [ТС] #16
alsav22, а если у меня в контейнере обьекты других классов, то для них тоже надо перегрузить операторы?
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.12.2013, 23:47 #17
Да.
1
o33ik
138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
15.12.2013, 00:42  [ТС] #18
alsav22, вот это я сделал перегрузку вывода в файл по примеру, что вы написали.
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
    friend std::ostream& operator<<(std::ostream& out, const Parts& a) 
    {        
        out << a.Name;
        out << a.Description;
        out << a.Type;
        out << a.cost;
        out << a.Amount;
        out << std::endl;
        return out;
    }


А как тогда считывание из файла сделать?

Добавлено через 2 минуты
вот так?
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
    friend std::istream& operator>>(std::istream& in, Parts& a)
    {
        in >> a.Name;
        in >> a.Description;
        in >> a.Type;
        in >> a.cost;
        in >> a.Amount;
        in.ignore(1);
        return in;
    }


Добавлено через 54 секунды
если у меня первые 3 поля - string, а остальные 2 - int?

Добавлено через 34 минуты
вроде чуть понял, но всеравно много вопросов. Parts содержит у меня 3 стринга(строки могут быть с пробелами) и два инта. Надо записывать контейнер таких обьектов в файл, и считивать обратно. Как писать в файл както более понятно(поля одного обьекта можно разделять "\n", разные обьекты наверное двома "\n"). Только как заставить тогра програму счытивать одну строчку в одне поле, вторую - в второе поле..., а потом переходить к счытиванию второго обьекта?
И как должен выгледить сам процес чтения(запись более менее понятно)? Такая зацикливаеться:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
    void openPartsFromFile()
    {
        std::ifstream fin("PARTS.DAT");
        Parts temp;
        while(!fin.eof())
        {
            fin >> temp;
            parts_list.push_back(temp);
            temp.show();
        }
        fin.close();
    }
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
15.12.2013, 01:16 #19
Когда строки или данные пишите, то нужно разделять их '\n'.
C++
1
2
3
4
5
6
7
8
9
10
friend std::ostream& operator<<(std::ostream& out, const Parts& a) 
    {        
        out << a.Name << endl;
        out << a.Description << endl;
        out << a.Type << endl;
        out << a.cost << endl;
        out << a.Amount << endl;
        
        return out;
    }
Объекты двумя '\n' разделять не нужно, потому что количество полей известно.
Цитата Сообщение от o33ik Посмотреть сообщение
Parts содержит у меня 3 стринга(строки могут быть с пробелами) и два инта.
Если с пробелами, то использовать getline() (13 пост), только перед getline() в потоке не должно быть '\n':
C++
1
2
3
4
5
6
7
8
9
10
friend std::istream& operator>>(std::istream& in, Parts& a)
    {
        getline(in, a.Name);
        getline(in, a.Description);
        getline(in, a.Type);
        in >> a.cost;
        in >> a.Amount;
        in.ignore(1); // убираем из потока '\n' перед следующим чтением
        return in;
    }
2
o33ik
138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
15.12.2013, 01:24  [ТС] #20
alsav22, таак, уже лучше) только так
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
    void openPartsFromFile()
    {
        std::ifstream fin("PARTS.DAT");
        Parts temp;
        while(!fin.eof())
        {
            fin >> temp;
            parts_list.push_back(temp);
            temp.show();
        }
        fin.close();
    }
последний обьект два раза читает
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
15.12.2013, 01:40 #21
Для примера:
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
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <cstdlib>
using namespace std;
 
class A
{
    
public:
    string a;
    string b;
    string c;
    int n;
    int m;
    
    friend ostream& operator<<(ostream& out, const A& obj) 
    {
        out << obj.a << endl;
        out << obj.b << endl;
        out << obj.c << endl;
        out << obj.n << endl;
        out << obj.m << endl;
        
        return out;
    }
 
    friend ifstream& operator>>(ifstream& fin, A& obj)
    {
        getline(fin, obj.a);
        getline(fin, obj.b);
        getline(fin, obj.c);
        fin >> obj.n;
        fin >> obj.m;
        fin.ignore(1);
        
        return fin;
    }
};
 
int main()
{
    const int N = 10;
    A arr[N];
    vector <A> vec;
    for (int i = 0; i < N; ++i)
    {
        arr[i].a = "aaa aaa";
        arr[i].b = "bbb bbb";
        arr[i].c = "ccc ccc";
        arr[i].n = i;
        arr[i].m = i + 1;
        vec.push_back(arr[i]);
    }
 
    ofstream fout("file");
    for (int i = 0; i < vec.size(); ++i)
        fout << vec[i];
    fout.close();
 
    vector <A> v;
    
    ifstream fin("file");
    if (fin)
    {
        A temp;
        while (fin >> temp)
            v.push_back(temp);
            
        fin.close();
    }
    else cout << "Error!" << endl;
 
     for (int i = 0; i < v.size(); ++i)
        cout << v[i];
 
    system("pause");
    return 0;
}
1
o33ik
138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
15.12.2013, 01:50  [ТС] #22
alsav22, вот за это реально огромное спасибо. ладно, завтра с тем обьектом, где поля - контейнеры других обьектов, разберусь. Если что, то еще напишу
0
o33ik
138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
15.12.2013, 12:53  [ТС] #23
alsav22, перегрузил операторы для UntreatedOrders
Кликните здесь для просмотра всего текста
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
#ifndef UNTREATEDORDER
 #define UNTREATEDORDER
#include <iostream>
#include <string>
#include <vector>
#include <list>
 
#include "Breakage.h"
#include "Consumables.h"
#include "Parts.h"
#include "Vehicle.h"
 
class UntreatedOrder
{
protected:
    Vehicle vehcl;
    std::vector<Breakage>breakg;
    std::vector<Parts>used_parts;
    std::vector<Consumables>used_consumables;
 
    char *date_format;
 
    time_t date_in;
    time_t deadline;
 
    bool status;
public:
    UntreatedOrder::UntreatedOrder()
    {
        date_format = "%d %B, %Y";
        status = false;
    }
    void add(std::list<Parts>*, std::list<Consumables>*);
    void show(int);
    void edit(std::list<Parts>*, std::list<Consumables>*);
    void make_done();
    Parts show_parts(std::list<Parts>*);
    Consumables show_consumables(std::list<Consumables>*);
    int return_all_price();
 
    friend std::ostream& operator<<(std::ostream& out, const UntreatedOrder& a) 
    {        
        out << a.breakg.size() << std::endl;
        for(int i = 0; i < a.breakg.size();i++)
        {
            out << a.breakg[i];
        }
        std::cout << std::endl;
        out << a.used_parts.size() << std::endl;
        for(int i = 0; i < a.used_parts.size();i++)
        {
            out << a.used_parts[i];
        }
        std::cout << std::endl;
        out << a.used_consumables.size() << std::endl;
        for(int i = 0; i < a.used_consumables.size();i++)
        {
            out << a.used_consumables[i];
        }
        std::cout << std::endl;
        out << a.vehcl << std::endl;
        out << a.date_in << std::endl;
        out << a.deadline << std::endl;
        return out;
    }
 
    friend std::istream& operator>>(std::istream& in, UntreatedOrder& a)
    {
        int n;
        in >> n;
        Breakage b;
        for (int i = 0; i < n; ++i)
        {
            in >> b;
            a.breakg.push_back(b);
        }
 
        in >> n;
        Parts p;
        for (int i = 0; i < n; ++i)
        {
            in >> p;
            a.used_parts.push_back(p);
        }
 
        in >> n;
        Consumables c;
        for (int i = 0; i < n; ++i)
        {
            in >> c;
            a.used_consumables.push_back(c);
        }
        in >> a.vehcl;
        in >> a.date_in;
        in >> a.deadline;
 
        in.ignore(1);
        return in;
    }
};
#endif
вот так:
Кликните здесь для просмотра всего текста
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
friend std::ostream& operator<<(std::ostream& out, const UntreatedOrder& a) 
    {        
        out << a.breakg.size() << std::endl;
        for(int i = 0; i < a.breakg.size();i++)
        {
            out << a.breakg[i];
        }
        std::cout << std::endl;
        out << a.used_parts.size() << std::endl;
        for(int i = 0; i < a.used_parts.size();i++)
        {
            out << a.used_parts[i];
        }
        std::cout << std::endl;
        out << a.used_consumables.size() << std::endl;
        for(int i = 0; i < a.used_consumables.size();i++)
        {
            out << a.used_consumables[i];
        }
        std::cout << std::endl;
        out << a.vehcl << std::endl;
        out << a.date_in << std::endl;
        out << a.deadline << std::endl;
        return out;
    }
 
    friend std::istream& operator>>(std::istream& in, UntreatedOrder& a)
    {
        int n;
        in >> n;
        Breakage b;
        for (int i = 0; i < n; ++i)
        {
            in >> b;
            a.breakg.push_back(b);
        }
 
        in >> n;
        Parts p;
        for (int i = 0; i < n; ++i)
        {
            in >> p;
            a.used_parts.push_back(p);
        }
 
        in >> n;
        Consumables c;
        for (int i = 0; i < n; ++i)
        {
            in >> c;
            a.used_consumables.push_back(c);
        }
        in >> a.vehcl;
        in >> a.date_in;
        in >> a.deadline;
 
        in.ignore(1);
        return in;
    }

в файл пишет, а вот читать не хочет.

елси так открывать
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
    void openOrdersFromFile()
    {
        std::ifstream fin("ORDERS.DAT");
        UntreatedOrder temp;
        while(fin >> temp)
        {
            untreated_orders.push_back(temp);
            temp.show(1);
        }
        fin.close();
    }

то просто цикл ниразу не выполняеться, а если поставить true и построчно проходить, то ошибка:
0
Миниатюры
Ошибка при открытые файла  
o33ik
138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
15.12.2013, 16:04  [ТС] #24
для Vehicle, Parts, Consumables и Breakage операторы перегрузил, их сохраняет и читает нормально

Добавлено через 5 минут
еще раз построчно прошел код, ошибка именно в строчке
C++
1
temp.show(1);
Хотя, если ее забрать, и потом просто просмотреть все заказы, то там пусто
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
15.12.2013, 18:13 #25
Покажите перегрузку для Breakage. Файл с записью UntreatedOrderсмотрели? Там пустых строк, случайно, нет? Что за show()? В UntreatedOrder разве есть такой?

Добавлено через 3 минуты
Смотрю я на ваш class UntreatedOrder и вижу там указатель: char *date_format. Не знаю, как вы его используете, но если в классе есть указатель, то всегда делают конструктор копирования, оператор присваивания и деструктор (http://ru.wikipedia.org/wiki/Правило_трёх_(C%2B%2B_программирование)).
1
o33ik
138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
15.12.2013, 18:35  [ТС] #26
alsav22, вот breakage
Кликните здесь для просмотра всего текста
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
#include <string>
#include <string>
#include <iostream>
#include <iomanip>
 
#include "FatherClass.h"
 
class Breakage: public FatherClass 
{
protected:
    bool repaired;
public:
    Breakage::Breakage()
    {
        repaired = false;
    }
 
    void add();
    void edit();
    void show();
    friend std::ostream& operator<<(std::ostream& out, const Breakage& a) 
    {        
        out << a.Name << std::endl;
        out << a.Description << std::endl;
        out << a.Type << std::endl;
        out << a.cost << std::endl;
        out << a.repaired << std::endl;
        return out;
    }
 
    friend std::istream& operator>>(std::istream& in, Breakage& a)
    {
        getline(in, a.Name);
        getline(in, a.Description);
        getline(in, a.Type);
        in >> a.cost;
        in >> a.repaired;
        in.ignore(1); 
        return in;
    }
};


Добавлено через 7 минут
alsav22, date_format использую в методе show для вывода даты(перевожу time_t в такой формат "%d %B, %Y"; ). Его сохрянять не надо. при создании обьекта он сам инициализируетсья в конструкторе. show() есть.
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
15.12.2013, 18:51 #27
show() увидел. Не на все вопросы ответили. Сделайте проверку на открытие файла. Файл новый создаёте после изменений в коде? А то бывает, что код изменили, а файл старый используется (если при создании содержимое не стирается, например, создаётся для дозаписи). Работайте с отладчиком, смотрите что не так.
1
o33ik
138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
15.12.2013, 20:03  [ТС] #28
alsav22, ну сейчас еще раз попробую.

Добавлено через 49 минут
alsav22,
Кликните здесь для просмотра всего текста
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
#ifndef UNTREATEDORDER
 #define UNTREATEDORDER
#include <iostream>
#include <string>
#include <vector>
#include <list>
 
#include "Breakage.h"
#include "Consumables.h"
#include "Parts.h"
#include "Vehicle.h"
 
class UntreatedOrder
{
protected:
    Vehicle vehcl;
    std::vector<Breakage>breakg;
    std::vector<Parts>used_parts;
    std::vector<Consumables>used_consumables;
 
    char *date_format;
 
    time_t date_in;
    time_t deadline;
 
    bool status;
public:
    UntreatedOrder::UntreatedOrder()
    {
        date_format = "%d %B, %Y";
        status = false;
    }
    void add(std::list<Parts>*, std::list<Consumables>*);
    void show(int);
    void edit(std::list<Parts>*, std::list<Consumables>*);
    void make_done();
    Parts show_parts(std::list<Parts>*);
    Consumables show_consumables(std::list<Consumables>*);
    int return_all_price();
 
    friend std::ostream& operator<<(std::ostream& out, const UntreatedOrder& a) 
    {        
        out << a.used_parts.size() << std::endl;
        for(int i = 0; i < a.used_parts.size();++i)
        {
            out << a.used_parts[i];
        }
        std::cout << std::endl;
        out << a.breakg.size() << std::endl;
        for(int i = 0; i < a.breakg.size();++i)
        {
            out << a.breakg[i];
        }
        std::cout << std::endl;
        out << a.used_consumables.size() << std::endl;
        for(int i = 0; i < a.used_consumables.size();++i)
        {
            out << a.used_consumables[i];
        }
        std::cout << std::endl;
        out << a.vehcl << std::endl;
        out << a.date_in << std::endl;
        out << a.deadline << std::endl;
        return out;
    }
 
    friend std::istream& operator>>(std::istream& in, UntreatedOrder& a)
    {
        system("cls");
        int n;
        in >> n;
        in.ignore(1); 
        std::cout << n;
        Parts p;
        for (int i = 0; i < n; ++i)
        {
            in >> p;
            p.show();
            a.used_parts.push_back(p);
        }
 
        in >> n;
        in.ignore(1); 
        std::cout << n;
        Breakage b;
        for (int i = 0; i < n; ++i)
        {
            in >> b;
            b.show();
            a.breakg.push_back(b);
        }
 
        in >> n;
        in.ignore(1); 
        Consumables c;
        for (int i = 0; i < n; ++i)
        {
            in >> c;
            c.show();
            a.used_consumables.push_back(c);
        }
        in >> a.vehcl;
        a.vehcl.show();
        in >> a.date_in;
        std::cout << a.date_in; 
        in >> a.deadline;
        std::cout << a.deadline;
 
        in.ignore(1);
        return in;
    }
};
#endif
теперь вроде работает нормально.

Добавлено через 38 секунд
только тут цикл два раза проходит
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
    void openOrdersFromFile()
    {
        std::ifstream fin("ORDERS.DAT");
        UntreatedOrder temp;
        while(fin >> temp)
        {
            untreated_orders.push_back(temp);
            temp.show(1);
        }
        fin.close();
    }


Добавлено через 42 секунды
но в контейнер кидает только первый елемент. сейчас попробую пару обьектов записать в файл

Добавлено через 6 минут
два заказа тоже нормально прочитало. только хз почему цикл один лишний раз проходит

Добавлено через 7 минут
alsav22, спасибо вам за огромное помощь, без вас я бы врятли сам сделал это сохранение
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
15.12.2013, 20:20 #29
Цитата Сообщение от o33ik Посмотреть сообщение
два заказа тоже нормально прочитало. только хз почему цикл один лишний раз проходит
Это нормально (код так сделан). Когда считывается последний temp (он читается до '\n', за которым EOF), то поток ещё рабочий, при следующем заходе поток портится и поэтому лишнего не прочитает, но будет выход из while().

Добавлено через 6 минут
Можно где-то в начале оператора чтения (после чтения первого, что портит поток) сделать проверку годности потока и делать return если поток нерабочий, чтобы не было лишних перемещений по коду. Заход будет, но не будет лишних действий.
1
15.12.2013, 20:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.12.2013, 20:20
Привет! Вот еще темы с ответами:

Ошибка при открытии файла на чтение - C++
Есть такая программа: #include &quot;stdafx.h&quot; #include &lt;fstream&gt; #include &lt;conio.h&gt; #include &lt;iomanip&gt; #include &lt;string.h&gt; ...

Ошибка при открытии файла в функции - C++
Всем доброго времени суток. Ошибка при открытии файла в функции, подскажите пожалуйста в чем проблема? void function(string...

Ошибка, при считывании инфы с файла... - C++
Вот есть код:#include &lt;iostream.h&gt; #include &lt;conio.h&gt; #include &lt;string.h&gt; #include &lt;fstream.h&gt; #include &lt;stdio.h&gt; #include...

Ошибка при попытке загрузки файла - C++
Задача состоит в том, чтобы по очереди загрузить файлы, введя их имена в консоль. #include &lt;fstream&gt; #include &lt;iostream&gt; using...


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

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

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