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

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

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

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

14.12.2013, 00:57. Просмотров 844. Ответов 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++):

Ошибка при вызове метода класса, при чтении из файла - 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. ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
o33ik
138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
14.12.2013, 01:07  [ТС] #2
из цикла оно выходит, и когда openFromFileParts доходит до конца, то ошибка(
alsav22
5417 / 4813 / 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
5417 / 4813 / 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
5417 / 4813 / 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
5417 / 4813 / 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
5417 / 4813 / 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
5417 / 4813 / 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
5417 / 4813 / 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;
    }
};
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.12.2013, 23:07
Привет! Вот еще темы с ответами:

Ошибка при открытии файла на чтение - 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...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
14.12.2013, 23:07
Ответ Создать тему
Опции темы

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