Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
14 / 11 / 3
Регистрация: 22.04.2018
Сообщений: 178
1

Происходит переполнение

25.06.2020, 14:37. Показов 1500. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, форумчане. Подскажите в чем причина. Взял пример из книги Роберта Лафоре. Переделал его под свои нужды, но происходит переполнение, и цикл который должен вывести все слова, уходит в бесконечность.

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
#include <iostream>
#include <fstream>
#include <windows.h>
 
using namespace std;
 
class vocolabry
{
protected:
    char word[20];
    char translate[20];
    
public:
    void get_words()
    {
        cout << "Введите слово по английски: "; cin >> word;
        cout << "Ведите перевод слова: "; cin >> translate;
    }
 
    void show_words()
    {
        cout << "Слово: " << word;
        cout << " Перевод: " << translate << endl;
    }
    void diskIn(int);
    void diskOut();
    static int diskCount();
};
 
void vocolabry::diskIn(int wd)
{
    ifstream infile;
    infile.open("vocolabry.dat", ios::binary);
    infile.seekg(wd* sizeof([B]vocolabry[/B]));
    infile.read((char*)this, sizeof(*this));
}
 
void vocolabry::diskOut()
{
    ofstream outfile;
    outfile.open("vocolabry.dat", ios::app | ios::binary);
    outfile.write((char*)this, sizeof(*this));
}
 
int vocolabry::diskCount()
{
    ifstream infile;
    infile.open("vocolabry.dat", ios::binary);
    infile.seekg(0, ios::end);
    return (int)infile.tellg();
}
 
int main()
{
    setlocale(LC_ALL, "rus");
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    vocolabry v1;
    char ch;
    do {
        v1.get_words();
        v1.diskOut();
        cout << "Продолжить ввод(y/n)? ";
        cin >> ch;
        if (ch == 'n')
            break;
    } while (ch != 'n');
    int t = vocolabry::diskCount();
    int j;
    cout << "В файле " << t << " слов(а)\n";
    for (j = 0; j < t; j++)
    {
        cout << "Слово: " << j <<endl;
        v1.diskIn(j);
        v1.show_words();
    }
    cout << endl;
    return 0;
}
Ошибка С26451 арифметическое переполнение использование опреатора * на байтовом значении 4 и приведение к байтовому значению 8. Пытался менять int на другой тип не помогает.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.06.2020, 14:37
Ответы с готовыми решениями:

Почему происходит переполнение?
Если диапазон float: -2 147 483 648.0 / 2 147 483 647.0, то почему происходит переполнение. Или...

происходит переполнение памяти ?
Пожалуйста помогите решить проблему: при компиляции ошибок нет, но при запуске выдает ошибку, я...

Не пойму где происходит переполнение массива
Я ошибся не переполнение, а выход за пределы #include &lt;iostream&gt; #include &lt;locale.h&gt; #include...

Как происходит переполнение при делении
Форумчане,подскажите желательно на С++, каким образом происходить переполнение буфера(или стэка)...

5
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
25.06.2020, 14:57 2
Цитата Сообщение от nemo19 Посмотреть сообщение
Ошибка С26451 арифметическое переполнение использование опреатора * на байтовом значении 4 и приведение к байтовому значению 8. Пытался менять int на другой тип не помогает.
Цитата Сообщение от nemo19 Посмотреть сообщение
infile.seekg(wd* sizeof(vocolabry));
Это не ошибка, а предупреждение, можно не обращать внимание (если у тебя в настройках проекта не включено трактовать предупреждения как ошибки)
C++
1
infile.seekg(size_t(wd) * sizeof(vocolabry));
1
14 / 11 / 3
Регистрация: 22.04.2018
Сообщений: 178
26.06.2020, 15:38  [ТС] 3
Не помогло, цикл все равно уходит в бесконечность.
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
26.06.2020, 15:51 4
Цитата Сообщение от nemo19 Посмотреть сообщение
Не помогло, цикл все равно уходит в бесконечность.
Какой цикл, вот этот?
Цитата Сообщение от nemo19 Посмотреть сообщение
cout << "В файле " << t << " слов(а)\n";
    for (j = 0; j < t; j++)
    {
        cout << "Слово: " << j <<endl;
Ну, во-первых - diskCount() надо вроде делить на sizeof(vocolabry), чтобы получить количество записей, вместо количества байт

Добавлено через 4 минуты
Во-вторых, наверное этот цикл должен быть вот таким
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
istream &vocolabry::diskIn(istream &in)
{
    return in.read((char*)this, sizeof(*this));
}
 
.............................................
 
ifstream infile;
infile.open("vocolabry.dat", ios::binary);
 
vocolabry vc;
for (size_ t i = 1; vc.diskIn(infile); ++i )
{
    cout << "Слово: " << i <<endl;
    v1.show_words();
}
Добавлено через 2 минуты
Не надо каждый раз открывать/закрывать файл. Открой его один раз для записи и один раз для чтения
1
14 / 11 / 3
Регистрация: 22.04.2018
Сообщений: 178
26.06.2020, 16:03  [ТС] 5
C++
1
2
vocolabry vc
vc.show_words();
Извините.
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
26.06.2020, 16:08 6
Цитата Сообщение от nemo19 Посмотреть сообщение
vocolabry vc
vc.show_words();
Ну да, скопипастил

Добавлено через 3 минуты
Запись сделай аналогично
C++
1
2
3
4
5
6
7
8
9
10
11
12
ofstream outfile;
outfile.open("vocolabry.dat", ios::binary);
vocolabry v1;
char ch;
do 
{
    v1.get_words();
    v1.diskOut(outfile);
........................
} while (ch != 'n');
 
outfile.close();
1
26.06.2020, 16:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.06.2020, 16:08
Помогаю со студенческими работами здесь

Вставлять тирэ после каждого второго символа строки? В коде скорее всего какое-то переполнение происходит
Помогите поправить Результат должэн быть вот таким jf-js-dl-fs-ld-k Спасибо. #include...

Переполнение
При выводе числа происходит переполнение и пребовление числа 64. Подскажите почему прибавилось...

Переполнение
При вводе слишком большого числа (например: 4444444444444444) программа зацикливается и постоянно...

Переполнение
Доброго времени суток! Есть код: void menu() { IndexList Universal; List *tmp = NULL; int...

Переполнение include
Здравствуйте! Такой вопрос есть класс Program и класс Universe, в классе Program я...

Переполнение стека
Всем добрый вечер. Я создаю вектор, который имеет большой размер: порядка 256000000. Этот вектор...


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

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