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

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

Восстановить пароль Регистрация
 
 
o33ik
138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
14.12.2013, 00:57     Ошибка при открытые файла #1
Ошибка при открытые файла. В файл запысывает нормально. Даже читает то что там есть(несколько обьектов) но после того как прочитает последний обьект, то ошибка, хз почему. Надо записать и прочитать обьекты класса Parts. В классе написал методы записи и чтения самы себя(взял с Лафоре). В autoRepair есть методы saveToFileParts и openFromFileParts. В проекте уже есть файлик который надо открыть(в нем два обьекта). Помогите мне пожалуста с етим, надо сдавать курсовую скоро, и только вот это не работает(
Вложения
Тип файла: 7z Kursak.7z (5.94 Мб, 7 просмотров)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
o33ik
138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
15.12.2013, 01:50  [ТС]     Ошибка при открытые файла #22
alsav22, вот за это реально огромное спасибо. ладно, завтра с тем обьектом, где поля - контейнеры других обьектов, разберусь. Если что, то еще напишу
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 и построчно проходить, то ошибка:
Миниатюры
Ошибка при открытые файла  
o33ik
138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
15.12.2013, 16:04  [ТС]     Ошибка при открытые файла #24
для Vehicle, Parts, Consumables и Breakage операторы перегрузил, их сохраняет и читает нормально

Добавлено через 5 минут
еще раз построчно прошел код, ошибка именно в строчке
C++
1
temp.show(1);
Хотя, если ее забрать, и потом просто просмотреть все заказы, то там пусто
alsav22
5282 / 4801 / 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/Правило...ограммирование)).
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() есть.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
15.12.2013, 18:51     Ошибка при открытые файла #27
show() увидел. Не на все вопросы ответили. Сделайте проверку на открытие файла. Файл новый создаёте после изменений в коде? А то бывает, что код изменили, а файл старый используется (если при создании содержимое не стирается, например, создаётся для дозаписи). Работайте с отладчиком, смотрите что не так.
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, спасибо вам за огромное помощь, без вас я бы врятли сам сделал это сохранение
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.12.2013, 20:20     Ошибка при открытые файла
Еще ссылки по теме:

C++ Ошибка при открытии файла на чтение
C++ Ошибка при запуске исполняемого файла
C++ Ошибка при чтении файла

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

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

Добавлено через 6 минут
Можно где-то в начале оператора чтения (после чтения первого, что портит поток) сделать проверку годности потока и делать return если поток нерабочий, чтобы не было лишних перемещений по коду. Заход будет, но не будет лишних действий.
Yandex
Объявления
15.12.2013, 20:20     Ошибка при открытые файла
Ответ Создать тему
Опции темы

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