С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
71 / 71 / 55
Регистрация: 04.06.2016
Сообщений: 237
1

Цикл While странно себя ведет

03.07.2017, 13:48. Показов 728. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Пишу программу которая считывает из каждой строки массив неизвестной длины.Цикл while(который помечен комментом) странно себя ведет,например ставлю точку останова на 76 строке = программа ни разу не стопается,а если вызову while(false) то заходит в цикл один раз.Изначально планировал сделать while(strlen(s)>0).Visual studio 2015
Содержимое data.txt:
4 5 8 45 2
3 16 9 52 3
7 6 45 -8 -45 -2 45
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
#include <stdio.h>
#include <conio.h>
#include <Windows.h>
#include <cmath>
 
using namespace std;
char* read_string(FILE *fp) {
 
    char c; int len = 0;
    long int pos = ftell(fp);
    while (1) {
 
        c = fgetc(fp);
 
        if (c == '\n') {
 
            break;
 
        }
 
        else len++;
 
        if (feof(fp)) break;
 
    }
    if (len == 0) return NULL;
    char *s = new char[len + 1];
    fseek(fp, pos, SEEK_SET);
    int i = 0;
    while (1) {
 
        c = fgetc(fp);
 
        if (c == '\n') {
 
            break;
 
        }
 
        else {
            
            s[i] = c;
            i++;
        }
 
        if (feof(fp)) break;
 
    }
    s[i] = '\0';
    return s;
 
}
 
int main()
{
 
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    FILE *fp = fopen("A:\\Users\\admin\\Desktop\\data.txt", "rt");
 
    if (!fp) {
 
        printf("Can't open file data.txt!"); getchar(); exit(1);
 
    }
    char* s = read_string(fp);
    int x = 1;
    while (true);//Этот цикл странно себя ведет
    {
        
        
        char **w = new char *[strlen(s) / 2];
        int num = 0;
        char *token = strtok(s, " ");
 
        while (token) {
 
            int len = strlen(token);
 
            w[num] = new char[len + 1];
 
            strcpy(w[num], token);
 
            num++;
 
            token = strtok(NULL, " ");
 
        }
        int *a = new int[num];
        for (size_t i = 0; i < num; i++)
        {
            a[i] = atoi(w[i]);
            printf("%d ", a[i]);
        }
        
            s = read_string(fp);
        
            
    }
    
    
 
 
 
    _getch();
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.07.2017, 13:48
Ответы с готовыми решениями:

cin странно себя ведет
Здравствуйте! Если в самом начале в майне написать char tch; cin.getline(tch,32) То все Ок,...

класс string. Программа странно себя ведет
Программа странно себя ведет. После первого ввода имени и номера сотрудника, пропускает последующие...

Счетчик для массивов странно себя ведет
Ниже код #include&lt;iostream&gt; using namespace std; int arr_size(int); int main(){ int...

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

5
308 / 271 / 220
Регистрация: 14.11.2016
Сообщений: 1,051
03.07.2017, 14:46 2
Encephalopathy, ; уберите
C++
1
while (true);//Этот цикл странно себя ведет
И память освобождать не забывайте.
1
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
03.07.2017, 15:12 3
Цитата Сообщение от Encephalopathy Посмотреть сообщение
while (true);//Этот цикл странно себя ведет
во первых он бесконечен притом надо убрать ;, где условие выхода? или так и надо?
1
71 / 71 / 55
Регистрация: 04.06.2016
Сообщений: 237
03.07.2017, 15:21  [ТС] 4
Спасибо теперь понял,условие изначально было strlen(s)>0 но поведение сбило столку и я поставил true.

Добавлено через 5 минут
anapshy, На счет памяти,не могли бы конкретнее подсказать?
0
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
03.07.2017, 15:24 5
Цитата Сообщение от Encephalopathy Посмотреть сообщение
На счет памяти,не могли бы конкретнее подсказать?
C++
1
delete
используйте

Добавлено через 1 минуту
как пример
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using namespace std;
 
int main()
{
    int *a = new int; 
    int *b = new int; 
 
    delete b;
    delete a;
 
    return 0;
}
0
71 / 71 / 55
Регистрация: 04.06.2016
Сообщений: 237
03.07.2017, 16:13  [ТС] 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
#include <stdio.h>
#include <conio.h>
#include <Windows.h>
#include <cmath>
 
using namespace std;
char* read_string(FILE *fp) {
 
    char c; int len = 0;
    long int pos = ftell(fp);
    while (1) {
 
        c = fgetc(fp);
 
        if (c == '\n') {
 
            break;
 
        }
 
        else len++;
 
        if (feof(fp)) break;
 
    }
    if (len == 0) return NULL;
    char *s = new char[len + 1];
    fseek(fp, pos, SEEK_SET);
    int i = 0;
    while (1) {
 
        c = fgetc(fp);
 
        if (c == '\n') {
 
            break;
 
        }
 
        else {
            
            s[i] = c;
            i++;
        }
 
        if (feof(fp)) break;
 
    }
    s[i] = '\0';
    return s;
 
}
 
int main()
{
 
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    FILE *fp = fopen("A:\\Users\\admin\\Desktop\\data.txt", "rt");
 
    if (!fp) {
 
        printf("Can't open file data.txt!"); getchar(); exit(1);
 
    }
    char* s = read_string(fp);
    int x = 1;
    while (strlen(s)>0)
    {
        
        
        char **w = new char *[strlen(s) / 2];
        int num = 0;
        char *token = strtok(s, " ");
 
        while (token) {
 
            int len = strlen(token);
 
            w[num] = new char[len + 1];
 
            strcpy(w[num], token);
 
            num++;
 
            token = strtok(NULL, " ");
 
        }
        delete token;
        if (num)
        {
            int *a = new int[num];
            for (size_t i = 0; i < num; i++)
            {
                a[i] = atoi(w[i]);
                printf("%d ", a[i]);
            }
            printf("\n");
            delete []a;
            for (size_t i = 0; i < num; i++)
            {
                delete w[i];
            }
            delete []w;
        }
            s = read_string(fp);
        
            
    }
    
    
 
 
 
    _getch();
    return 0;
}
Так?

Добавлено через 45 секунд
Выдает ошибку HEAP CORRUPTION DETECTED

Добавлено через 1 минуту
Уже после того как выведет все строки из файла.

Добавлено через 8 минут
Все вроде разобрался.

Добавлено через 2 минуты
В конце файла программа почему-то считывала букву Я в качестве последней строки и пыталась создать массив с [0] элементов.Не понятно только откуда Я взялась,в файле её нет.

Добавлено через 32 минуты
Откуда Я взялось тоже разобрался.
0
03.07.2017, 16:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.07.2017, 16:13
Помогаю со студенческими работами здесь

Работаю с файлом *.txt. Прога ведет себя странно если последняя строка файла пуста. Почему так?
Добрый день! Помогите пожалуйста с небольшой проблемой. Что хотел сделать: Есть текстовый файл,...

Програма неадекватно себя ведет
Доброго время суток , помогите пожалуйста с кодом... Тут такое дело - програма запрашивает длинну...

Файловая система C++ некорректно себя ведет
Файловая система C++ некорректно себя ведет. Считываю .bmp-файл в структуру (не во всю сразу), при...

Итератор по разному себя ведет в цикле
Есть такой кусочек кода: string findKey (string key) { for (auto it = sectionList.begin();...


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

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