Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 12.10.2019
Сообщений: 26

Лишняя строка

14.12.2019, 22:01. Показов 2166. Ответов 11

Студворк — интернет-сервис помощи студентам
Всем привет, нужна помощь, целый день сижу над этой проблемой.
Написал программу которая должна изменять строки в файле.
Работает программа не так как я ожидаю, откуда-то появляеться загадочная лишняя строка.

Вот код
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
#include "pch.h"
#include <iostream>
#include <fstream>
#include <string>
 
using namespace std;
 
int main()
{
    fstream myFile;
    string path = "purchase.txt";
    string txt_overallCost = "Overall cost:", txt_discount = "Discount:", txt_toPay = "To pay:";
    string temp;
 
    const int BORDER_COST = 5000;
    const int DISCOUNT = 5;
    const int DEFAULT_DISCOUNT = 2;
    int pos, costValue;
    bool needToChange = false;
 
    myFile.open(path, ios_base::binary | ios_base::in | ios_base::out | ios_base::ate);
    if (!myFile.is_open()) {
        cout << "Error opening file " << path << endl;
        return 1;
    }
 
    myFile << "\n";
    myFile.seekp(0);
 
    while (!myFile.eof()) {
        temp = "";
        getline(myFile, temp);
        if (temp.compare(0, txt_overallCost.length(), txt_overallCost) == 0) {
            pos = myFile.tellg();
            myFile.seekg(pos - (temp.length() - txt_overallCost.length()));
            char num[10];
            myFile >> num;
            costValue = atoi(num);
 
            if (costValue >= BORDER_COST) {
                cout << "Yes" << endl;
                needToChange = true;
            }
            else {
                cout << "No" << endl;
            }
            break;
        }
    }
 
    if (needToChange) {
 
        while (!myFile.eof()) {
            temp = "";
            getline(myFile, temp);
            if (temp.compare(0, txt_discount.length(), txt_discount) == 0) {
                pos = myFile.tellp();
                myFile.seekp(pos - (temp.length() - txt_discount.length()));
                myFile << DISCOUNT;
                while (!myFile.eof()) {
                    temp = "";
                    getline(myFile, temp);
                    if (temp.compare(0, txt_toPay.length(), txt_toPay) == 0) {
                        pos = myFile.tellp();
                        myFile.seekp(pos - (temp.length() - txt_toPay.length()));
                        myFile << costValue - costValue * (DISCOUNT*1.0 / 100);
                        break;
                    }
 
                }
                break;
            }
        }
    }
 
    else {
        while (!myFile.eof()) {
            temp = "";
            getline(myFile, temp);
            if (temp.compare(0, txt_toPay.length(), txt_toPay) == 0) {
                pos = myFile.tellp();
                myFile.seekp(pos - (temp.length() - txt_toPay.length()));
                myFile << costValue - costValue * (DEFAULT_DISCOUNT*1.0 / 100);
                break;
            }
 
        }
    }
 
    myFile.close();
 
    return 0;
 
}
Исходный файл purchase.txt
C++
1
2
3
4
5
6
7
Check №2342323
 
Surname: Petrov
Date of purchase: 04.07.2019
Overall cost: 6000
Discount: 2 %
To pay:
Результат выполнения программы
C++
1
2
3
4
5
6
7
8
Check №2342323
 
Surname: Petrov
Date of purchase: 04.07.2019
Overall cost: 6000
Discount: 5000
Discount: 2 %
To pay: 5700
Ожидаемый результат
C++
1
2
3
4
5
6
7
Check №2342323
 
Surname: Petrov
Date of purchase: 04.07.2019
Overall cost: 6000
Discount: 5 %
To pay: 5700
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.12.2019, 22:01
Ответы с готовыми решениями:

Eof() лишняя строка
при использовании eof() выводиться лишняя несуществующая в файле строка. внимание не обращал пока не написал функцию удаление определенной...

Лишняя строка в файле
void Vvod() { ofstream file(Name, ios::app); if (!file) { cout &lt;&lt; &quot;Ошибка! Такого файла не существует!&quot; &lt;&lt; endl; ...

Выводится лишняя строка из файла
Здравствуйте. При выводе из файла выводится лишняя строка. Т.е. если 13 строк в файле, то выводится 14 пустая строка. Вот код: void...

11
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
14.12.2019, 22:23
не используйте eof()
При считывании из файла последний элемент читается дважды
1
0 / 0 / 0
Регистрация: 12.10.2019
Сообщений: 26
14.12.2019, 22:29  [ТС]
Yetty, согласен, eof некорректно работает в данном случае, но я думаю проблема не в нем, так как у меня предусмотрен выход из цикла.
Я не могу понять почему какая-то непонятная строка выводиться
Я думаю, что проблема с getline, но решения ее пока не нашел
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
14.12.2019, 22:41
Лучший ответ Сообщение было отмечено zEEmperon как решение

Решение

zEEmperon, записывать в файл с помощью seekp чревато тем, что пишешь поверх старой информации, в итоге может образоваться какая-нибудь фигня
0
0 / 0 / 0
Регистрация: 12.10.2019
Сообщений: 26
14.12.2019, 22:42  [ТС]
zayats80888, и что мне делать?
0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
14.12.2019, 22:56
zEEmperon, логично нормально считывать построчно, редактировать строку и нормально записывать в новый файл.

вообще вопросы начинайте с формулировки условия задачи
1
0 / 0 / 0
Регистрация: 12.10.2019
Сообщений: 26
14.12.2019, 23:03  [ТС]
Yetty, Данные о покупке представлены в файле и содержат фамилию покупателя, дату покупки, общую стоимость покупки, процент скидки. Увеличить процент скидки до 5 процентов, если стоимость покупки превышает 5000 рублей. Изменить соответствующим образом исходный файл (*Задание*)
0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
14.12.2019, 23:54
zEEmperon, не проверял, попробуйте так (пример для 3 значений). это не рабочий код, а возможная схема решения
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
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
 
int main()
{    
    ... // объявление a1, a2, a3
    ifstream in("in.txt");
    ofstream out("out.txt");
 
    if (in.is_open())
    {
        while (in >> a1 >> a2 >> a3)
        {
         ... // действия с переменными
         out << a1 << " " << a2 << " " << a3 << "\n";
        }
    }
    else cout << "Unable to open file\n";
     
    // удаление и переименование
    remove("in.txt");
    rename("out.txt", "in.txt");
    remove("out.txt");
system("pause");
return 0;
}
1
0 / 0 / 0
Регистрация: 12.10.2019
Сообщений: 26
15.12.2019, 01:18  [ТС]
zayats80888, Yetty, спасибо за помощь в решении (+rep), вы помогли мне двигаться в правильном направлении в поисках)

По факту решением моей задачи было добавление в код
C++
1
myFile.seekp(pos)
после одного из циклов

Просидел над этой задачей несколько часов, а требовалось дописать лишь одну строчку)))

Вот готовый, вдруг кому-то пригодиться))
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
#include "pch.h"
#include <iostream>
#include <fstream>
#include <string>
 
using namespace std;
 
int main()
{
    fstream myFile;
    string path = "purchase.bin";
    string txt_overallCost = "Overall cost:", txt_discount = "Discount:", txt_toPay = "To pay:";
    string temp;
 
    const int BORDER_COST = 5000;
    const int DISCOUNT = 5;
    int pos, costValue, default_DISCOUNT;
    bool needToChange = false;
 
    myFile.open(path, ios_base::binary | ios_base::in | ios_base::out | ios_base::ate);
    if (!myFile.is_open()) {
        cout << "Error opening file " << path << endl;
        return 1;
    }
 
    myFile << "\n";
    myFile.seekp(0);
 
    while (true) {
        temp = "";
        getline(myFile, temp);
        if (temp.compare(0, txt_overallCost.length(), txt_overallCost) == 0) {
            pos = myFile.tellg();
            myFile.seekg(pos - (temp.length() - txt_overallCost.length()));
            myFile >> costValue;
            if (costValue >= BORDER_COST) {
                cout << "Yes" << endl;
                needToChange = true;
            }
            else {
                cout << "No" << endl;
            }
            break;
        }
    }
    if (needToChange) {
 
        while (true) {
            temp = "";
            getline(myFile, temp);
            if (temp.compare(0, txt_discount.length(), txt_discount) == 0) {
                pos = myFile.tellp();
                myFile.seekp(pos - (temp.length() - txt_discount.length()));
                int temp_pos = myFile.tellp();
                myFile >> default_DISCOUNT;
                myFile.seekp(temp_pos);
                myFile << DISCOUNT + default_DISCOUNT;
                break;
            }
        }
        myFile.seekp(pos);
        while (true) {
            temp = "";
            getline(myFile, temp);
            if (temp.compare(0, txt_toPay.length(), txt_toPay) == 0) {
                pos = myFile.tellp();
                myFile.seekp(pos - (temp.length() - txt_toPay.length()));
                myFile << costValue - costValue * ((DISCOUNT + default_DISCOUNT)*1.0 / 100);
                break;
            }
        }
    }
 
    else {
        while (!myFile.eof()) {
            temp = "";
            getline(myFile, temp);
            if (temp.compare(0, txt_toPay.length(), txt_toPay) == 0) {
                pos = myFile.tellp();
                myFile.seekp(pos - (temp.length() - txt_toPay.length()));
                myFile << costValue - costValue * (default_DISCOUNT*1.0 / 100);
                break;
            }
 
        }
    }
    myFile.close();
    return 0;
}
0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
15.12.2019, 01:36
zEEmperon, Вам решать какой способ выбрать. выше показал как Ваша задача решается очень просто, да и строк будет раза в три меньше.
0
0 / 0 / 0
Регистрация: 03.10.2019
Сообщений: 40
17.12.2019, 17:24
Извините, а где он удаляет лишнюю строчку, я не совсем понимаю как программа работает?
0
0 / 0 / 0
Регистрация: 12.10.2019
Сообщений: 26
17.12.2019, 17:40  [ТС]
GraphGFX, я не удаляю лишнюю строку
У меня появилась лишняя строка предположительно из за того, что в поток попадали данные, которые не должны были туда попадать
В данной программе я не удаляю лишнюю строку, а избавляюсь от причин ее вывода
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.12.2019, 17:40
Помогаю со студенческими работами здесь

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

Выводится одна лишняя строка (работа с бинарным файлом)
Буду благодарен за помощь. #include&lt;iostream&gt; #include &lt;fstream&gt; #include &lt;algorithm&gt; #include &lt;string&gt; #include...

Лишняя скобка?
Ругается на строку str = L&quot;всё&quot;; Так- error C2059: синтаксическая ошибка: ] \wchar\wchar\wchar.cpp 11 #include &lt;iostream&gt; ...

Лишняя черта
Программа &quot;Слияние&quot;, не могу избавиться от последней черты (&quot; | &quot;) в выводе &quot;Выдач&quot;. Прошу помочь с удалением последней черты. ...

Оптимизация. Лишняя информация в решении
Суть задачи заключалась в отыскании четных и нечетных значений массива, найти их сумму. Задачу решил. #include &lt;iostream&gt; ...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru