Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
o33ik
138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
1

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

14.12.2013, 00:57. Просмотров 973. Ответов 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
Ответы с готовыми решениями:

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

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

Ошибка при открывании файла
Здравствуйте, При создании проэкта вылетает ошибка, пересмотрел все, програма...

Ошибка при чтении из файла
Файл открывается, но читаться из него информация не хочется. Исходник int...

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

28
o33ik
138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
14.12.2013, 01:07  [ТС] 2
из цикла оно выходит, и когда openFromFileParts доходит до конца, то ошибка(
0
alsav22
5442 / 4837 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
14.12.2013, 01:49 3
Здесь почитайте на эту тему:
Код из "Р.Лафоре. ООП в С++"
Запись и чтение объектов разных классов в один файл
Запись и извлечение данных в несколько запусков программы
Не могу найти ошибку. Запись/чтение из файла

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

Добавлено через 1 минуту
alsav22, кстати, есть смылс гуглить сериализацию для моей проблемы?
0
alsav22
5442 / 4837 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
14.12.2013, 02:22 7
Цитата Сообщение от o33ik Посмотреть сообщение
alsav22, кстати, есть смылс гуглить сериализацию для моей проблемы?
Если я правильно понимаю, сериализация должна помочь со string, но не поможет с полиморфизмом. Но не утверждаю, сереализацией не интересовался. Можно ведь не использовать бинарное чтение\запись: читать\записывать полями.
1
o33ik
138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
14.12.2013, 13:25  [ТС] 8
alsav22, я решил эту проблему так: сделал еще один класс, который никого не наследует, поля максимально похожи на поля класса Parts, только вместо стрингов массивы char. Сделал так что Parts можно перевести в обьект етого класса и наоборот. Сохраняю и открываю я именно эти промежуточные обьекты. Проблем нет. Только вот, Parts простенький класс, а untreated_order не простенький. Хочу сохранять каждый заказ в отдельный файл, но как записать в один файл обьекты разных классов, и потом их всех считать?
0
alsav22
5442 / 4837 / 831
Регистрация: 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;
}
1
o33ik
138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
14.12.2013, 17:40  [ТС] 10
alsav22, а как записывать полями?
0
alsav22
5442 / 4837 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
14.12.2013, 18:04 11
Форматируемая записи: fout << pole classa << '\n'
1
o33ik
138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
14.12.2013, 18:41  [ТС] 12
alsav22, ....что? чесно говоря, я не очень понял эту строчку. та и как потом считать?

Добавлено через 34 секунды
думаю попробую использовать сериализацию из буста.
0
alsav22
5442 / 4837 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
14.12.2013, 18:45 13
Цитата Сообщение от o33ik Посмотреть сообщение
и как потом считать?
Обычно. Если string, то getline(fin, pole_classa), если int, то fin >> pole_classa, и т.п.
1
o33ik
138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
14.12.2013, 21:54  [ТС] 14
alsav22, можно пример небольшой(где одно из полей класса - контейнер(в моем случае - вектор))?
0
alsav22
5442 / 4837 / 831
Регистрация: 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;
    }
};
1
o33ik
138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
14.12.2013, 23:37  [ТС] 16
alsav22, а если у меня в контейнере обьекты других классов, то для них тоже надо перегрузить операторы?
0
alsav22
5442 / 4837 / 831
Регистрация: 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
5442 / 4837 / 831
Регистрация: 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
15.12.2013, 01:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.12.2013, 01:24

Ошибка при чтении из файла
Помогите разобраться с чтением из файла. Листинг указан ниже. Программа...

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

Ошибка при открытии файла в функции
Всем доброго времени суток. Ошибка при открытии файла в функции, подскажите...


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

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

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