Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
1

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

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

Author24 — интернет-сервис помощи студентам
Ошибка при открытые файла. В файл запысывает нормально. Даже читает то что там есть(несколько обьектов) но после того как прочитает последний обьект, то ошибка, хз почему. Надо записать и прочитать обьекты класса Parts. В классе написал методы записи и чтения самы себя(взял с Лафоре). В autoRepair есть методы saveToFileParts и openFromFileParts. В проекте уже есть файлик который надо открыть(в нем два обьекта). Помогите мне пожалуста с етим, надо сдавать курсовую скоро, и только вот это не работает(
Вложения
Тип файла: 7z Kursak.7z (5.94 Мб, 9 просмотров)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.12.2013, 00:57
Ответы с готовыми решениями:

При отправке файла при помощи TFTP в логе появляется запись: "Синтаксическая ошибка в имени файла"
Здравствуйте! Использую такую команду: >tftp 192.x.x.150 get C:\scan\file_555.txt 192.x.x.68...

При открытии Opera, пропадают открытые закладки
Доброе время суток, кто-то может объяснить новую «фишку» Opera 46.0: за последние примерно 19...

При "пробуждении" ноутбук загружается, как при обычном включении и все открытые до сна вкладки теряются
Здравствуйте! На ноутбуке установлена Win 8.1. При нажатии кнопки сна, компьютер переходит в спящий...

При открытии проекта не открываются последние открытые окна
Сколько лет при открытии проекта в VS2010 открывались автоматически все окна, которые были открыты...

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

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

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

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

Винда скрывает все открытые окна при перетаскивании одного
привет открыто окон 20 различных программ беру одно и начинаю перетаскивать его за шапку если...

Ошибка при открытии файла - Ошибка в части содержимого в книге
Добрый день! Открываю файл. Создаю макросом сводную таблицу, сохраняю файл. Затем при попытке...

FTP SERV-U Ошибка при копировании файла при медленном интернете
На машине на системе WIN7 стоит FTP сервер SERV-U. Другие машины используют для выхода в интернет...

При использовании кода в модуле ошибка при открытии файла
есть такой простенький код, которій отлично работает в скрипте *.pl use Cwd; my $cwd =...

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

Ошибка при подключение файла БД SQLite при сборке в Maven в Intellij IDEA
Доброго времени суток, у меня возникла проблема с доступом к файлу БД SQLite после сборки Мавеном в...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru