Форум программистов, компьютерный форум 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 просмотров)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
o33ik
138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
14.12.2013, 01:07  [ТС]     Ошибка при открытые файла #2
из цикла оно выходит, и когда openFromFileParts доходит до конца, то ошибка(
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.12.2013, 01:49     Ошибка при открытые файла #3
Здесь почитайте на эту тему:
Код из "Р.Лафоре. ООП в С++"
Запись и чтение объектов разных классов в один файл
Запись и извлечение данных в несколько запусков программы
Не могу найти ошибку. Запись/чтение из файла

Добавлено через 27 минут
Ситуацию у вас усугубляют поля string. Такие классы проблематично читать\записывать, в бинарном режиме, и без таблиц виртуальных функций.
o33ik
138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
14.12.2013, 01:52  [ТС]     Ошибка при открытые файла #4
alsav22, почитал темы. всеравно не понял в чем дело. говорят что если обьект класса в котором есть виртуальные методы, то нельзя использовать для него бинарное чтение\запись. Но при етом, я записал, и прочитал(я построчно протестил код в методе openFromFileParts с выводом даных обьекта, все вывело так как вводил). А когда метод доходит до конца, то ошибка
Миниатюры
Ошибка при открытые файла   Ошибка при открытые файла  
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.12.2013, 02:09     Ошибка при открытые файла #5
Цитата Сообщение от o33ik Посмотреть сообщение
alsav22, почитал темы. всеравно не понял в чем дело. говорят что если обьект класса в котором есть виртуальные методы, то нельзя использовать для него бинарное чтение\запись. Но при етом, я записал, и прочитал(я построчно протестил код в методе openFromFileParts с выводом даных обьекта, все вывело так как вводил). А когда метод доходит до конца, то ошибка
Если темы внимательно прочитали, то должны понять что: может работать, может не работать (почему в темах есть объяснение). Например, запишите данные в файл в Debug, а прочитайте из файла в Release. Наверняка, уже не будет нормально работать. Код большой, там и другие ошибки могут быть, но какой смысл в них разбираться, если в основе заложена кривизна. Насчёт бинарного чтения/записи string может здесь почитать: фейл при чтении из файла
Работа с бинарными файлами (программка дважды записывает последнее число)
o33ik
138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
14.12.2013, 02:14  [ТС]     Ошибка при открытые файла #6
alsav22, то все из за полиморфизма(такое я прочитал в других темах)?

Добавлено через 1 минуту
alsav22, кстати, есть смылс гуглить сериализацию для моей проблемы?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.12.2013, 02:22     Ошибка при открытые файла #7
Цитата Сообщение от o33ik Посмотреть сообщение
alsav22, кстати, есть смылс гуглить сериализацию для моей проблемы?
Если я правильно понимаю, сериализация должна помочь со string, но не поможет с полиморфизмом. Но не утверждаю, сереализацией не интересовался. Можно ведь не использовать бинарное чтение\запись: читать\записывать полями.
o33ik
138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
14.12.2013, 13:25  [ТС]     Ошибка при открытые файла #8
alsav22, я решил эту проблему так: сделал еще один класс, который никого не наследует, поля максимально похожи на поля класса Parts, только вместо стрингов массивы char. Сделал так что Parts можно перевести в обьект етого класса и наоборот. Сохраняю и открываю я именно эти промежуточные обьекты. Проблем нет. Только вот, Parts простенький класс, а untreated_order не простенький. Хочу сохранять каждый заказ в отдельный файл, но как записать в один файл обьекты разных классов, и потом их всех считать?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.12.2013, 16:11     Ошибка при открытые файла #9
Зачем все эти сложности, если просто можно записывать поля?
При компиляции, выдаётся предупреждение (warning C4715: OnlyInteger::return_ineger: значение возвращается не при всех путях выполнения) на этот метод:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    int return_ineger()
    {
        char buffer[20];
        bool WhileChar = true;
        while(WhileChar)
        {
            std::cin >> buffer;
            int returned = atoi(buffer);
            if(returned == 0 && strcmp(buffer, "0") != 0)
            {
                std::cout << "\n\tПомилка! Вводьте лише числа.";
                std::cin.get();
                std::cin.get();
            }
            else 
                return returned;
        }
    }
Если это защита от ввода не чисел, то работать не будет.
В void Breakage::edit() есть использование неинициализированной переменной types_key:
C++
1
2
3
4
5
6
...
int types_key;
OnlyInteger i;
key = i.return_ineger();
Type = b_types[types_key - 1];
...
Добавлено через 3 минуты
Код для защиты от ввода не целых чисел (в строке ввода только цифры, перед которыми могут быть + или -):
C++
1
2
3
4
5
6
7
int a;
while (!(cin >> a) || (cin.peek() != '\n'))
{
    cin.clear();
    while (cin.get() != '\n');
    cout << "Error!" << endl;
}
o33ik
138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
14.12.2013, 17:40  [ТС]     Ошибка при открытые файла #10
alsav22, а как записывать полями?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.12.2013, 18:04     Ошибка при открытые файла #11
Форматируемая записи: fout << pole classa << '\n'
o33ik
138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
14.12.2013, 18:41  [ТС]     Ошибка при открытые файла #12
alsav22, ....что? чесно говоря, я не очень понял эту строчку. та и как потом считать?

Добавлено через 34 секунды
думаю попробую использовать сериализацию из буста.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.12.2013, 18:45     Ошибка при открытые файла #13
Цитата Сообщение от o33ik Посмотреть сообщение
и как потом считать?
Обычно. Если string, то getline(fin, pole_classa), если int, то fin >> pole_classa, и т.п.
o33ik
138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
14.12.2013, 21:54  [ТС]     Ошибка при открытые файла #14
alsav22, можно пример небольшой(где одно из полей класса - контейнер(в моем случае - вектор))?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.12.2013, 23:07     Ошибка при открытые файла #15
Кликните здесь для просмотра всего текста

Можно так:
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
#include <iostream>
#include <fstream>
#include <vector>
#include <ctime>
#include <cstdlib>
using namespace std;
 
class A
{
    vector <int> v;
public:
    vector <int>& getv()
    {
        return v;
    }
    
    friend ofstream& operator<<(ofstream& fout, const A& a) // в файл
    {
        fout << a.v.size() << endl;
        for (int i = 0; i < a.v.size(); ++i)
            fout << a.v[i] << ' ';
        fout << endl;
        
        return fout;
    }
 
    friend ostream& operator<<(ostream& out, const A& a) // на консоль
    {
        for (int i = 0; i < a.v.size(); ++i)
            out << a.v[i] << ' ';
        out << endl;
        
        return out;
    }
 
    friend istream& operator>>(istream& in, A& a)
    {
        int n;
        in >> n;
        int m;
        for (int i = 0; i < n; ++i)
        {
            in >> m;
            a.v.push_back(m);
        }
 
        return in;
    }
};
 
int main()
{
    srand(time(0));
    
    const int N = 10;
    A arr[N];
    for (int i = 0; i < N; ++i)
    {
        int m = rand() % 9 + 1;
        for (int j = 0; j < m; ++j)
            arr[i].getv().push_back(rand() % 10);
    }
 
    ofstream fout("file");
    for (int i = 0; i < N; ++i)
        fout << arr[i];
    fout.close();
 
    A arr2[N];
    ifstream fin("file");
    if (fin)
    {
        for (int i = 0; i < N; ++i)
            fin >> arr2[i];
        fin.close();
    }
    else cout << "Error!" << endl;
 
     for (int i = 0; i < N; ++i)
        cout << arr2[i];
 
    system("pause");
    return 0;
}
Можно так:
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
class A
{
    vector <int> v;
public:
    vector <int>& getv()
    {
        return v;
    }
    
    friend ostream& operator<<(ostream& out, const A& a) 
    {
        for (int i = 0; i < a.v.size(); ++i)
        {
            out << a.v[i];
            if (i != a.v.size() - 1) out << ' ';
        }
        out << endl;
        
        return out;
    }
 
    friend istream& operator>>(istream& in, A& a)
    {
        int n;
        while (in.peek() != '\n')
        {
            in >> n;
            a.v.push_back(n);
        }
        in.ignore(1);
        return in;
    }
};
o33ik
138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
14.12.2013, 23:37  [ТС]     Ошибка при открытые файла #16
alsav22, а если у меня в контейнере обьекты других классов, то для них тоже надо перегрузить операторы?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.12.2013, 23:47     Ошибка при открытые файла #17
Да.
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();
    }
alsav22
5282 / 4801 / 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;
    }
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.12.2013, 01:24     Ошибка при открытые файла
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
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();
    }
последний обьект два раза читает
Yandex
Объявления
15.12.2013, 01:24     Ошибка при открытые файла
Ответ Создать тему
Опции темы

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