Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
1 / 1 / 0
Регистрация: 04.05.2019
Сообщений: 58
1

Надо найти ошибку. С++. Не обрабатывает

11.05.2019, 15:16. Показов 1168. Ответов 38

Author24 — интернет-сервис помощи студентам
Программа ищет и выводит на экран строки из файла, которые удовлетворяют запросу.
Выдает такое предупреждение, если в файле нашлось несколько совпадений:
"Возникло необработанное исключение по адресу 0x771018A2 в prog.exe: исключение Microsoft C++: std::out_of_range по адресу памяти 0x00CFF910."


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
#include <iostream>
#include <vector>
#include <string>
#include <fstream>
 
using namespace std;
 
int main()
{
    vector<string> mas_str;
    system("chcp 1251");
    system("cls");
 
    fstream tests;
    string dop;
    int counter = 0;
    tests.open("file.txt", ios::in);
 
    do{
        getline(tests, dop);
        counter++;
        mas_str.push_back(dop);
    } while (!tests.eof());
 
    for (int i = 0; i < mas_str.size(); i++)
    {
        cout << mas_str[i] << endl;
    }
 
    string search;
    int result_numb = 0;
    int flag1 = 0;
    int flag2 = 0;
    int length_of_search = 0;
    cout << "введите поиск  ";
    getline(cin, search);
    length_of_search = search.size();
 
    
        for (int i = 0; i < mas_str.size(); i ++)
        {
            result_numb = mas_str[i].compare(3, length_of_search, search); /* Т.к. поиск идет по фамилии, а она в строках стоит после 3х пробелов от начала строки, я написал такое условие. Делал через compare, а не через find, чтобы искал только по заданному диапазону. С 4-й позиции и до конца длины слова из поискового запроса. Чтобы дальше по строке он уше не проверял. Чтобы, если в другой графе ( не фамилия, а к примеру в адресе ) встретится слово из поискового запроса, то на печать бы вышли только варианты, где фамилия нашлась именно в графе фамилий. */
            if ((result_numb == 0)&&(flag1 == 0)) {
                cout << "Найдены совпадения" << endl << endl;
                cout << mas_str[i] << endl;
                flag1 = 1;
                flag2 = 1;
            } else
                if ((result_numb == 0) && (flag1 == 1)) {
                    cout << mas_str[i] << endl;
                    flag2 = 1;
                }
            
            
        }cout << endl;
        if ((result_numb != 0)&& (flag2 == 0)) {
            cout << endl;
            cout << "Совпадений нет" << endl;
            cout << endl;
        }
    
 
    system("pause");
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.05.2019, 15:16
Ответы с готовыми решениями:

Надо найти ошибку
Всем привет! Вот задали задачку, решаю, а не выходит точно, можно сказать вообще не правильно...

надо найти ошибку
program ZADACA2_1; uses crt; var H:text; P,Pn,Pk,hP:integer; V,Vn,Vk,hV:real;...

Надо найти ошибку...
Добрый день, дорогие программисты! Пишу курсач &quot;Преломление/отражение света в воде, стекле, масле&quot;...

Надо найти ошибку
Отдельные буквы русского алфавита, слова, фразы. Свойства: шрифт, размер, стиль (полужирный,...

38
599 / 237 / 69
Регистрация: 08.08.2015
Сообщений: 1,637
11.05.2019, 23:13 21
Author24 — интернет-сервис помощи студентам
MikaSan, если сам составлял файл то лучше переформатируй на манеру JSON или не "|" а допустим точкойс запятой или \t через банальный .split

Добавлено через 5 минут
тогда ошибки с ренжом практически не будет
0
1 / 1 / 0
Регистрация: 04.05.2019
Сообщений: 58
12.05.2019, 00:30  [ТС] 22
Цитата Сообщение от Mesteriis Посмотреть сообщение
MikaSan, если сам составлял файл то лучше переформатируй на манеру JSON или не "|" а допустим точкойс запятой или \t через банальный .split

Добавлено через 5 минут
тогда ошибки с ренжом практически не будет
В результате я просто переписал алгоритм по другому, используя другую функцию. В общем, я не смог разобраться с ренджом.
Что вообще этот рендж из себя представляет и что делает?
0
599 / 237 / 69
Регистрация: 08.08.2015
Сообщений: 1,637
12.05.2019, 12:29 23
MikaSan, да особо нечего, это так сказать условное понятие в данной ошибки. смотри
C++ (Qt)
1
2
3
4
5
6
7
8
9
 // есть строка 
std:string x = "some text";
// если попросим ее длинну посчитать то получим
qDebug (x.size); // 9
// если обратится по адресу все ок. Точнее фигня но не ощибка
qDebub (x[11]);
// а вот если функцией обратится через функцию
qDebub (x.substr(11, "x"));
// получим как раз ошибку выход за рамки массива, то есть тут функция умнее обычного [] там тоже должна быть ошибка ренжа
Но это прям совсем на пальцах не говоря о тебе памяти и все из этого вытекающего
0
1 / 1 / 0
Регистрация: 04.05.2019
Сообщений: 58
12.05.2019, 13:27  [ТС] 24
Цитата Сообщение от Mesteriis Посмотреть сообщение
MikaSan, да особо нечего, это так сказать условное понятие в данной ошибки. смотри
C++ (Qt)
1
2
3
4
5
6
7
8
9
 // есть строка 
std:string x = "some text";
// если попросим ее длинну посчитать то получим
qDebug (x.size); // 9
// если обратится по адресу все ок. Точнее фигня но не ощибка
qDebub (x[11]);
// а вот если функцией обратится через функцию
qDebub (x.substr(11, "x"));
// получим как раз ошибку выход за рамки массива, то есть тут функция умнее обычного [] там тоже должна быть ошибка ренжа
Но это прям совсем на пальцах не говоря о тебе памяти и все из этого вытекающего
Опять столкнулся с этой проблемой. В чем ее причина, я так и не могу понять. Есть какие-то соображения?)

Добавлено через 8 минут
Цитата Сообщение от MikaSan Посмотреть сообщение
Опять столкнулся с этой проблемой. В чем ее причина, я так и не могу понять. Есть какие-то соображения?)
Попытался через буффер сделать. Чтобы функция с итерацией дела не имела. Но результат тот-же.

C++
1
2
3
string buff;
buff = mas_str[i];
result_numb = buff.compare(3, length_of_search, search);
0
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
12.05.2019, 13:42 25
MikaSan,
Цитата Сообщение от MikaSan Посмотреть сообщение
buff.compare(3, length_of_search, search);
данная перегрузка этой функции бросает исключение, если buff.size() < 3. А у вас в конце вектора строки такие есть, т.к. вы криво читаете файл.
1
599 / 237 / 69
Регистрация: 08.08.2015
Сообщений: 1,637
12.05.2019, 14:04 26
MikaSan, весь код плиз и сам файл, или он тот же?
0
1 / 1 / 0
Регистрация: 04.05.2019
Сообщений: 58
12.05.2019, 14:11  [ТС] 27
Цитата Сообщение от Mesteriis Посмотреть сообщение
MikaSan, весь код плиз и сам файл, или он тот же?
Тот же
0
599 / 237 / 69
Регистрация: 08.08.2015
Сообщений: 1,637
12.05.2019, 14:12 28
Цитата Сообщение от MikaSan Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
getline(cin, search);
* * length_of_search = search.size();
for (int i = 0; i < mas_str.size(); i ++)
* * * * {
* * * * * * result_numb = mas_str[i].compare(3, length_of_search, search); /* Т.к. поиск идет по фамилии, а она в строках стоит после 3х пробелов от начала строки, я написал такое условие. Делал через compare, а не через find, чтобы искал только по заданному диапазону. С 4-й позиции и до конца длины слова из поискового запроса. Чтобы дальше по строке он уше не проверял. Чтобы, если в другой графе ( не фамилия, а к примеру в адресе ) встретится слово из поискового запроса, то на печать бы вышли только варианты, где фамилия нашлась именно в графе фамилий. */
* * * * * * if ((result_numb == 0)&&(flag1 == 0)) {
* * * * * * * * cout << "Найдены совпадения" << endl << endl;
* * * * * * * * cout << mas_str[i] << endl;
* * * * * * * * flag1 = 1;
* * * * * * * * flag2 = 1;
* * * * * * } else
* * * * * * * * if ((result_numb == 0) && (flag1 == 1)) {
* * * * * * * * * * cout << mas_str[i] << endl;
* * * * * * * * * * flag2 = 1;
* * * * * * * * }
}
Блин проще с нуля переписать. Особенно напрегает gelline

Добавлено через 52 секунды
MikaSan, Запрос у\идет только по фамилии?
0
1 / 1 / 0
Регистрация: 04.05.2019
Сообщений: 58
12.05.2019, 14:13  [ТС] 29
Цитата Сообщение от zayats80888 Посмотреть сообщение
MikaSan,
данная перегрузка этой функции бросает исключение, если buff.size() < 3. А у вас в конце вектора строки такие есть, т.к. вы криво читаете файл.
То есть? Откуда у меня там строки такие?))
А как его читать иначе? Конечно я забыл закрыть файл после работы с ним, но разве это повлияет на результат в данном случае?
0
599 / 237 / 69
Регистрация: 08.08.2015
Сообщений: 1,637
12.05.2019, 14:19 30
MikaSan, На пустую строку в конце проверил??))))

Добавлено через 52 секунды
MikaSan, Вообще лучше контролировать строку до загрузки в вектор, да и структуру сделать вдруг надо обратится только к одному элементу
0
1 / 1 / 0
Регистрация: 04.05.2019
Сообщений: 58
12.05.2019, 14:31  [ТС] 31
Цитата Сообщение от Mesteriis Посмотреть сообщение
Блин проще с нуля переписать. Особенно напрегает gelline

Добавлено через 52 секунды
MikaSan, Запрос у\идет только по фамилии?
Да. Поиск идет только по фамилии. Но это легко меняется диапазоном сравнения символов в строках
Прошу прощения за дезу. Я дописал еще чисто визуальную составляющую. Она при вывод найденных строк, те что длинее 95 символов визуально обрезает ( только на печать ), чтобы на новую строку не перескакивали ( размеры окна консоли стоят 100 на 30 )
Вот дописанный цикл.
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
for (int i = 0; i < mas_str.size(); i++)
    {
        buff = mas_str[i];
        result_numb = buff.compare(3, length_of_search, search);
        if ((result_numb == 0) && (flag == 0)) {
            cout << "Найдены совпадения" << endl << endl;
            flag = 1;
            flag1 = 1;
        }
        if ((result_numb == 0) && (flag == 1)) {
            counter1++;
            if (mas_str[i].size() > 95) {
                 str_buff = mas_str[i].substr(0, 95);
                 cout << i << str_buff << "..." << endl;
            }
            else {
            cout << i << mas_str[i] << endl;
 
            }
        }
    }
    cout << endl;
    if (flag1 != 1) {
        cout << endl;
        cout << "Совпадений нет" << endl;
        cout << endl;
    }
Добавлено через 4 минуты
Цитата Сообщение от Mesteriis Посмотреть сообщение
MikaSan, На пустую строку в конце проверил??))))

Добавлено через 52 секунды
MikaSan, Вообще лучше контролировать строку до загрузки в вектор, да и структуру сделать вдруг надо обратится только к одному элементу
Я в будущем и хочу обращаться только к 1 элементу. Но со структурами у меня беда. Дико туплю с указателями.
Как контролировать ее до загрузки в вектор? Векторы я только недавно открыл для себя. И в коде вроде бы просто считываю все из файла в вектор. Хотя я кажется подозреваю в чем дело... В цикле считывания строка эта последняя появляется?

Добавлено через 2 минуты
Цитата Сообщение от Mesteriis Посмотреть сообщение
MikaSan, На пустую строку в конце проверил??))))

Добавлено через 52 секунды
MikaSan, Вообще лучше контролировать строку до загрузки в вектор, да и структуру сделать вдруг надо обратится только к одному элементу
Черт, действительно создается пустая строка. Но как ее убрать безболезненно?
К слову, прав ли я в том, что из-за этой последней, пустой строки, когда функция начинает свою работу по сравниванию строк, то не может найти там нужной длины и выдает ошибку?

Добавлено через 3 минуты
Цитата Сообщение от Mesteriis Посмотреть сообщение
MikaSan, На пустую строку в конце проверил??))))

Добавлено через 52 секунды
MikaSan, Вообще лучше контролировать строку до загрузки в вектор, да и структуру сделать вдруг надо обратится только к одному элементу
Может сделать два вектора? В один будет идти считывание из файла. А второй будет забирать строки из первого, кроме последнего, ориентируясь на счетчик counter? Но это как-то громоздко. Может как-то полегче можно от пустой последней строки избавиться?
0
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
12.05.2019, 14:41 32
Цитата Сообщение от MikaSan Посмотреть сообщение
while (!tests.eof());
так делать не надо, это ошибка.
Во вторых просто добавь в цикле поиска проверку на размер строки
0
1 / 1 / 0
Регистрация: 04.05.2019
Сообщений: 58
12.05.2019, 14:51  [ТС] 33
Цитата Сообщение от zayats80888 Посмотреть сообщение
так делать не надо, это ошибка.
Во вторых просто добавь в цикле поиска проверку на размер строки
а как тогда мне написать проверку на вывод всего файла?
С проверкой размера строки все увенчалось успехом!))))) Спасибо огромное!))

Добавлено через 8 секунд
Спасибо всем!
0
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
12.05.2019, 14:54 34
MikaSan,
C++
1
2
3
4
//построчное чтение файла в вектор
std::ifstream ifs{ "file.txt" };
std::vector<std::string> lines;
for (std::string line; std::getline(ifs, line); lines.push_back(line));
0
1 / 1 / 0
Регистрация: 04.05.2019
Сообщений: 58
12.05.2019, 20:03  [ТС] 35
Цитата Сообщение от zayats80888 Посмотреть сообщение
MikaSan,
C++
1
2
3
4
//построчное чтение файла в вектор
std::ifstream ifs{ "file.txt" };
std::vector<std::string> lines;
for (std::string line; std::getline(ifs, line); lines.push_back(line));
О, красиво. попробую заменить. Правда для меня это совсем не очевидный способ вывести все строки из файла)). ТО есть алгоритм работает, пока не достигнет конца файла? Вернее, пока может считывать строки? Если я ошибаюсь, то растолкуйте пожалуйста))) А то так и не пойму))
0
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
12.05.2019, 20:07 36
MikaSan,
C++
1
2
3
4
5
for (
    std::string line;           // локальная строковая переменная, инициализируется при первом вхождении в цикл
    std::getline(ifs, line);    // считывает строку, возвращает ссылку на поток, если поток не ОК, цикл завершается
    lines.push_back(line)       // в конце итерации пушим строку в вектор
    );
0
1 / 1 / 0
Регистрация: 04.05.2019
Сообщений: 58
12.05.2019, 20:17  [ТС] 37
Цитата Сообщение от zayats80888 Посмотреть сообщение
MikaSan,
C++
1
2
3
4
5
for (
    std::string line;           // локальная строковая переменная, инициализируется при первом вхождении в цикл
    std::getline(ifs, line);    // считывает строку, возвращает ссылку на поток, если поток не ОК, цикл завершается
    lines.push_back(line)       // в конце итерации пушим строку в вектор
    );
Черт, это прекрасно. Если бы видели, насколько сейчас не оптимизирована моя курсовая, то наверное потрепали бы меня по плечу и молча ушли бы в закат))))) Спасибо огромное за объяснения!)))
0
599 / 237 / 69
Регистрация: 08.08.2015
Сообщений: 1,637
13.05.2019, 23:01 38
MikaSan, Это сейчас такиие курсачи))))) Я помню писал GUI с шифрованием текста в картинку)
0
1 / 1 / 0
Регистрация: 04.05.2019
Сообщений: 58
14.05.2019, 14:19  [ТС] 39
Если кого заинтересует тема и будет желание объяснить классы и разбитие программы на файлы Классы в С++. Разделение программы на файлы. Объясните пожалуйста на пальцах
0
14.05.2019, 14:19
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.05.2019, 14:19
Помогаю со студенческими работами здесь

Надо найти ошибку
Задача: дан массив, требуется найти два равных в нем элемента и вывести их индексы. Есть логически...

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

Надо найти ошибку ,пожалуйста,
должна посчитать два интеграла, но считает их почему то неверно( метод парабол) помогите найти...

Массивы.Надо найти ошибку
program lab7; uses crt; var a:array of integer;i,j:integer;s:real; begin clrscr;randomize;...


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

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