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

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

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

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

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

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

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

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

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

Ошибка при запуске исполняемого файла - C++
Требование к разработке: Разработать программы для генерации и проверки подписей по ГОСТ Р34.10-94. Рекомендуемые значения общих открытых...

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

Ошибка при чтении данных из файла - C++
Имеем такую функцию чтения даных из фаила: void chtenie(char *imafaila) { FILE *sklad= fopen(imafaila, "r"); if...

Ошибка при чтении бинарного файла - C++
почему у меня выводит два раза последнюю запись при чтении??(а файл записываю класс с 3 полями(номер,фамилия,код) #include "stdafx.h"...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5416 / 4812 / 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
5416 / 4812 / 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
5416 / 4812 / 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++
#include&lt;iostream&gt; #include&lt;iomanip&gt; #include&lt;string&gt; #include&lt;fstream&gt; using namespace std; class Person { protected: int...

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

Ошибка при подключении заголовочного файла - C++
Есть некий класс вот его заголовочный файл #include &lt;string&gt; class OSY { public: OSY(); void get(std::string &amp;x1, int...

Ошибка при побайтовом чтении файла - C++
Не могу понять: есть файл, в нем лежат байты: FF 55 11 22 33 44 когда я считываю байты таким образом: struct MyStruct { ...

ofstream / ошибка при создании файла - C++
ofstream f( L&quot;C:\\Users\\Джон Грегорович\\Documents\\RAD Studio\\Projects\\.\\Win32\\Debug\\BackUp\\Wstud.txt&quot;); создает файл, но за...


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

Или воспользуйтесь поиском по форуму:
alsav22
5416 / 4812 / 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     Ошибка при открытые файла
Ответ Создать тему
Опции темы

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