Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
68 / 48 / 8
Регистрация: 13.11.2017
Сообщений: 291
1

Запись в файл не происходит, информация считывается неверно (найти и исправить ошибки в коде)

22.08.2018, 07:35. Просмотров 997. Ответов 12
Метки нет (Все метки)

Здравствуйте. Программа скомпилировалась, запускается, но плохо работает. Файл открывается, данные считываются, вручную информация вводится. Проблемы есть с пунктами 2, 4, 6. Файл создаю, но его нигде нет. Данные в файл не записываются. Информация считается не верно. Подскажите, пожалуйста, где ошибки. Как можно подправить.

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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#include <iostream>
#include <conio.h>
#include <fstream>
using namespace std;
 
struct Priamoyg
{
    double a;
    double b;
    double c;
    double d;
};
 
void Menu()
{
    cout << "1 - Открыть файл для считывания данных\n";
    cout << "2 - Создать файл для ввода данных\n";
    cout << "3 - Считать данные из файла\n";
    cout << "4 - Записать данные в файл\n";
    cout << "5 - Ввести данные вручную\n";
    cout << "6 - Показать информацию о прямоугольнике\n";
    cout << "0 - Выход\n";
}
 
void Input(istream &is, Priamoyg &priam)
{
    //double a, b, c, d;
    while (!(is >> priam.a, priam.b, priam.c, priam.d || priam.a != priam.c || priam.b != priam.d))
    {
        cout << "Это не прямоугольник!!!\n";
        cout << "Повторите ввод!\n";
    }
    cout << endl;
 
    /*priam.a = a;
    priam.b = b;
    priam.c = c;
    priam.d = d;*/
}
 
void Read(ofstream &os, const Priamoyg &priam)
{
    os << priam.a << " " << priam.b << " " << priam.c << " " << priam.d << endl;
}
 
void Info(const Priamoyg &priam)
{
    system("cls");
    cout << "Прямоугольник: \n";
    cout << "Длины сторон: \n";
    cout << "a = " << priam.a << " b = " << priam.b << " c = " << priam.c << " d = " << priam.d;
    cout << endl;
 
    cout << "Периметр: " << 2 * (priam.a + priam.b) << endl;
    cout << "Площадь: " << (priam.a*priam.b) << endl;
 
    _getch();
}
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    cout << "***Прямоугольник***\n\n";
 
    char c;
    char filename[30];
 
    ofstream fout;
    ifstream fin;
    Priamoyg priam;
 
    bool fileInput = false;
    bool fileRead = false;
 
    do
    {
        Menu();
        cin >> c;
 
        switch (c)
        {
        case '1':
            cout << "Введите имя файла: ";
            cin >> filename;
            fin.open(filename);
            if (!fin.is_open())
            {
                cout << "Такого файла нет!!!";
                _getch();
                fileInput = false;
                break;
            }
            else fileInput = true;
            break;
        case '2':
            cout << "Введите имя файла: ";
            cin >> filename;
            fout.open(filename, ios::app);
            break;
        case '3':
            if (!fileInput)
            {
                break;
            }
            Input(fin, priam);
            fileRead = true;
            break;
        case '4':
            if (fileRead && fout.is_open())
            {
                Read(fout, priam);
            }
            break;
        case '5':
            cout << "Введите 4-ые стороны прямоугольника: ";
            Input(cin, priam);
            fileRead = true;
            break;
        case '6':
            if (fileRead)
                Info(priam);
            break;
        case '0':
            break;
        default: cout << "Некорректный вариант выбора!" << endl;
        }
        system("cls");
    } while (c != '0');
 
    _getch();
    return 0;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.08.2018, 07:35
Ответы с готовыми решениями:

Чтение, обработка и запись в бинарный файл. Найти и исправить ошибки в коде
Есть строка, ее надо разбить на слова с буквой d. Строку ввести с экрана, потом записать в...

Найти ошибки в коде и исправить эти ошибки (Наследование)
Вот в общем 3 файла, изучаю наследование на примере односвязного и двусвязного списков: list.h...

Найти ошибки в коде и исправить эти ошибки
Есть у меня вот такой код: #include &lt;iostream&gt; using namespace std; class A{ private:...

Найти ошибки в коде и исправить эти ошибки - C++
Судя по вываливающейся ошибки, идет двойное освобождение памяти. У самого не получается отловить...

12
(80 / 20 || 50 / 50) = x
1599 / 1083 / 417
Регистрация: 16.08.2014
Сообщений: 4,532
Записей в блоге: 1
22.08.2018, 07:48 2
eganator, во втором пункте ты добавляешь в файл которого нет, а в первом ты создаешь его
C++
1
2
3
4
5
6
case '2':
    cout << "Введите имя файла: ";
    cin >> filename;
    fout.open(filename);
    fout.close();
    break;
1
68 / 48 / 8
Регистрация: 13.11.2017
Сообщений: 291
22.08.2018, 07:58  [ТС] 3
_stanislav, В первом пункте я открываю файл, который есть на компьютере. Если например я ввиду имя файла, которого нет, то мне выводится сообщение, что файл не найден.

Добавлено через 52 секунды
_stanislav, Второй пункт работает, разобрался. Но не происходит запись информации в файл. И информация не верно выдаётся.
0
шКодер самоучка
2094 / 1837 / 894
Регистрация: 09.10.2013
Сообщений: 4,008
Записей в блоге: 7
22.08.2018, 08:46 4
Цитата Сообщение от eganator Посмотреть сообщение
is >> priam.a, priam.b, priam.c, priam.d
Оператор "запятая" коварная вещь.
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
bool CheckRectangle(const Rectangle &rect)
{
    return rect.a == rect.c && rect.b == rect.d
}
 
bool InputRectangle(istream &is, Rectangle &rect)
{
    Rectangle tmp;
    if (is >> tmp.a >> tmp.b >> tmp.c >> tmp.d )
    {
        rect = tmp;
    }
    return is.good();
}
 
void ManualInput(istream &is, Rectangle &rect)
{
    do
    {
        if (false == InputRectangle(is, rect))
        {
            cerr << "Ошибка формата ввода, повторите" << endl;
            is.clear(); // сброс ошибки ввода
        }
        else if (false == CheckRectangle(rect))
        {
            cerr << "Это не прямоугольник!!!\n";
            cerr << "Повторите ввод!\n";
        }
        else
        {
            break;
        }
    }
    while(true);
}
1
26 / 23 / 12
Регистрация: 25.06.2018
Сообщений: 91
22.08.2018, 09:12 5
Запустил у себя - все работает. Единственно. я бы поменял немного Input
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void Input(istream &is, Priamoyg &priam)
{
    bool inp = false;
    while (inp == false)
    {
       is >> priam.a >> priam.b >> priam.c >> priam.d;
       if(priam.a  != priam.c || priam.b != priam.d)
       {
        cout << "Это не прямоугольник!!!\n";
        cout << "Повторите ввод!\n";
       }
       else
          inp = true;
    }
    cout << endl;
}
И заметил бы, что вводя ручками ты должен указывать числа с точкой, иначе будет неправильно. Например: 2.0 3.0 2.0 3.0
И еще: прямоуголник характеризуется тем, что у него противоположные стороны равны, поэтому достаточно двух сторон. Но тогда надо считать, что углы по 90 градусов.
1
68 / 48 / 8
Регистрация: 13.11.2017
Сообщений: 291
22.08.2018, 10:42  [ТС] 6
Max Dark, AndreiUshakov, Спасибо! Глупая ошибка) У меня почему-то не записываются ещё данные в файл по команде 4. Даже когда создаю новый документ, ввожу данные, прошу показать инфу и записать затем в файл, то по завершению программы файл пуст. Вроде ошибку не могу найти, не подскажите, в чём дело может быть?
0
шКодер самоучка
2094 / 1837 / 894
Регистрация: 09.10.2013
Сообщений: 4,008
Записей в блоге: 7
22.08.2018, 14:45 7
eganator, покажите текущую версию исходника.
0
26 / 23 / 12
Регистрация: 25.06.2018
Сообщений: 91
22.08.2018, 16:54 8
Хотелось бы также полный исходник взглянуть. У меня сработала запись в файл, чтение из него. Ваш бы вариант посмотреть
0
68 / 48 / 8
Регистрация: 13.11.2017
Сообщений: 291
23.08.2018, 03:57  [ТС] 9
AndreiUshakov, Имеете ввиду текстовый файл?
0
Вложения
Тип файла: txt Priam.txt (15 байт, 1 просмотров)
68 / 48 / 8
Регистрация: 13.11.2017
Сообщений: 291
23.08.2018, 04:12  [ТС] 10
Чтение работает, а вот в файл длины сторон по команде 4 почему-то не пишет.
0
26 / 23 / 12
Регистрация: 25.06.2018
Сообщений: 91
23.08.2018, 08:02 11
Цитата Сообщение от eganator Посмотреть сообщение
AndreiUshakov, Имеете ввиду текстовый файл?
Сам исходник программы. Формат текстового файла с данными я и так представляю. там ничего нет сложного - четыре числа. А по исходному коду можно сказать, где у вас "собака порылась"
0
68 / 48 / 8
Регистрация: 13.11.2017
Сообщений: 291
23.08.2018, 10:43  [ТС] 12
AndreiUshakov, Исходный код программы представлен в моей теме, в самом первом сообщении.

Вот, если нужно, функция записи в файл и её вызов:
C++
1
2
3
4
void Read(ofstream &os, const Priamoyg &priam)
{
    os << priam.a << " " << priam.b << " " << priam.c << " " << priam.d << endl;
}
C++
1
2
3
4
5
6
case '4':
            if (fileRead && fout.is_open())
            {
                Read(fout, priam);
            }
            break;
0
26 / 23 / 12
Регистрация: 25.06.2018
Сообщений: 91
23.08.2018, 11:45 13
Лучший ответ Сообщение было отмечено eganator как решение

Решение

Должно туда писаться. Скорее всего не пишется, по причине того что вы 2 раза пытаетесь открыть один и тот же файл. Чтобы не было этого лучше изменить немного ввод. Объединить функцию 1 и 3, так как открытие файла для чтения данных означает уже и их чтение, а также 2 и 4, чтоб создать файл и записать туда данные, учитывая, что сохранить данные можно только тогда, когда они есть. После выполнения этих действий необходимо закрыть использованный файл. Также поменял бы названия: у вас название Read, а вы туда пишете. Короче посмотрите код такой (Объединенный с Max Dark). Сразу напишу, что
C++
1
2
3
4
    char filename[30];
    ifstream os;
    cout << "Введите имя файла: ";
    cin >> filename;
дико мне не нравится, так дыра в безопасности и возможно переполнение буфера, но пока плюнем на это

итак код:
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#include <iostream>
#include <conio.h>
#include <fstream>
using namespace std;
 
struct Rectangle
{
    double a;
    double b;
    double c;
    double d;
};
 
void Menu()
{
    cout << "1 - Считать данные из файла\n";
    cout << "2 - Записать данные в файл\n";
    cout << "3 - Ввести данные вручную\n";
    cout << "4 - Показать информацию о прямоугольнике\n";
    cout << "0 - Выход\n";
}
 
 
bool checkRectangle(const Rectangle &rect)
{
    return rect.a == rect.c && rect.b == rect.d
}
 
bool readRectangle(istream &is, Rectangle &rect)
{
    Rectangle tmp;
    if (is >> tmp.a >> tmp.b >> tmp.c >> tmp.d )
    {
        rect = tmp;
    }
    return is.good();
}
 
bool readData(istream &is, Rectangle &rect)
{
        if (false == readRectangle(is, rect))
        {
            cerr << "Ошибка формата ввода" << endl;
            is.clear(); // сброс ошибки ввода
            return false;
        }
        else if (false == checkRectangle(rect))
        {
            cerr << "Это не прямоугольник!!!\n";
            return false;
        }
        return true;
}
 
 
bool readFromFile(Rectangle &rect)
{
    char filename[30];
    ifstream os;
 
    cout << "Введите имя файла: ";
    cin >> filename;
    os.open(filename);
    if (!fin.is_open())
    {
         cout << "Такого файла нет!!!";
         getch();
         return false;
    }
    bool result = readData(os, rect);
    os.close();
    return result;    
}
 
void saveToFile(const Rectangle &rect)
{
   char filename[30];
   ofstream os;
   cout << "Введите имя файла: ";
   cin >> filename;
   if(os.open(filename, ios::app)
   {
        os << rect.a << " " << rect.b << " " << rect.c << " " << rect.d << endl;
        if(!os.good())
           cout << "Ошибка записи в файл" << endl;
        os.close();
    }
    else
    {
        cout << "Ошибка создания/открытия файла" << endl;
    }
}
 
 
void Info(const Rectangle &rect)
{
    system("cls");
    cout << "Прямоугольник: \n";
    cout << "Длины сторон: \n";
    cout << "a = " << rect.a << " b = " << rect.b << " c = " << rect.c << " d = " << rect.d;
    cout << endl;
 
    cout << "Периметр: " << 2 * (rect.a + rect.b) << endl;
    cout << "Площадь: " << (rect.a*rect.b) << endl;
 
    _getch();
}
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    cout << "***Прямоугольник***\n\n";
 
    char c;
 
    Rectangle rect;
    bool dataReaded = false;
 
    do
    {
        Menu();
        cin >> c;
 
        switch (c)
        {
        case '1':
            dataReaded = readFromFile(rect);
            break;
        case '2':
            if(dataReaded)
                 saveToFile(rect);
            else
                 cout << "Нет данных для сохранения в файле" << endl;
            break;
        case '3':
            cout << "Введите 4-ые стороны прямоугольника: ";
            dataReaded = readData(cin, rect);
            break;
        case '4':
            if (dataReaded)
                Info(rect);
            else
                 cout << "Нет данных для отображения" << endl;
            break;
        case '0':
            break;
        default: 
            cout << "Некорректный вариант выбора!" << endl;
        }
        system("cls");
    } while (c != '0');
 
    _getch();
    return 0;
}
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.08.2018, 11:45

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Вывод структуры в файл. Исправить ошибки в коде
Здравствуйте. Пишу программу с структурой и вводом в файл. Выдает ошибку что не определены...

Найти и исправить ошибки в коде
#include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;string.h&gt; #include &lt;time.h&gt; struct stadiums{...

Найти и исправить ошибки в коде
Не могу найти ошибку в коде и выбивает кучу абсурдных ошибок #include&quot;stdafx.h&quot; #include...

Найти и исправить ошибки в коде
Подскажите пожалуйста, у меня не считает, что я неправильно сделала #include &lt;windows.h&gt;...

Найти и исправить ошибки в коде
Подскажите пожалуйста, дорогие граждане форума. Где я накосячил?) #include &lt;iostream&gt; using...

Найти и исправить ошибки в коде
Помогите найти ошибку С #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt;


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

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

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