Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 25, средняя оценка - 4.84
Gooman
10 / 10 / 0
Регистрация: 03.10.2010
Сообщений: 350
#1

Функция getline не считывает пробелы - C++

04.02.2012, 13:41. Просмотров 3328. Ответов 23
Метки нет (Все метки)

Написал код программы для вывода из файла строк, где есть двузначные цифры. Пользовался функцией getline. Но указанные в процессе работы программы строки выводятся "слипшиеся" - без пробелов.

Вот код программы:

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
#include "stdafx.h"
#include "iostream"
#include "fstream"
//#include "stdio.h"
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    // создание входного потока и открытие файла
    ifstream fin("c:\\projects\\text1.txt", ios::in);
    if (!fin)
    {
        cout << "Can't open input file" << endl;
        system("pause");
        return -1;
    } 
 
    char buf[255];
    char lim;
    int i = 0;
    while (!fin.eof())      // пока не конец файла
    {
        i = 0;
        cout<<endl;
        fin.getline(buf, 255, lim = '\n');  // считать одну строку
        while (buf[i])                      // рассмотреть каждый символ этой строки
        {
            if (buf[i] >= '1' && buf[i] < '100')    // если текущий символ - двузначная цифра
                cout << buf[i];                     // то начать выводить эту строку посимвольно
            i++;                                    // перепестить индекс массива buf вперед
        }
    }
    
    fin.close();
    fout.close();
    cout << endl;
    cout << endl;
    system("pause");
    return 0;
}
Можете подсказать, как с помощью этой функции считывать и пробелы. Или может другая функция существует?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Gooman
10 / 10 / 0
Регистрация: 03.10.2010
Сообщений: 350
04.02.2012, 17:56  [ТС]     Функция getline не считывает пробелы #21
Цитата Сообщение от Kastaneda Посмотреть сообщение
Одного предыдущего символа и двух следующих будет достаточно, т.к. если число из 3х и более цифр, то строка уже не подходит.
Нет. Если в строке есть хоть одно двухзначное число, то она подходит.
Kastaneda
Форумчанин
Эксперт С++
4489 / 2851 / 227
Регистрация: 12.12.2009
Сообщений: 7,244
Записей в блоге: 1
Завершенные тесты: 1
04.02.2012, 17:56     Функция getline не считывает пробелы #22
если писать в стиле "С", то я бы сделал через конечный автомат.
Gooman
10 / 10 / 0
Регистрация: 03.10.2010
Сообщений: 350
04.02.2012, 17:57  [ТС]     Функция getline не считывает пробелы #23
В общем, я вот так написал:

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
while (!fin.eof())      // пока не конец файла
    {
        good_str = 0;
        i = 0;
        cout<<endl;
        fin.getline(buf, 255, lim = '\n');  // считать одну строку
        while (buf[i])  // рассмотреть каждый символ этой строки 
        { 
            if (isdigit(buf[i]))        // если текущее число - цифра
                //if (isdigit(buf[i+1]) && (i+1) <= 255)    // если последующий символ тоже цифра
                if (isdigit(buf[i+1]))
                    //if (!isdigit(buf[i+2]) && (i+2) <= 255)
                    if (!isdigit(buf[i+2]))
                    {
                        good_str = 1;
                        break;
                    }
                    else 
                    {
                        good_str = 0;
                    }
            i++;
        } 
        if (good_str)
        {
           cout << buf << endl;
           //fout << buf << endl;
        }
    }
Но оно выводит и строки, где есть только трехзначные и более числа.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.02.2012, 18:37     Функция getline не считывает пробелы
Еще ссылки по теме:
C++ Функция getline
Функция getline C++
функция getline() в dev_C++ C++
Функция getline(cin,.) C++
Не выполняется функция getline() C++

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

Или воспользуйтесь поиском по форуму:
Kastaneda
Форумчанин
Эксперт С++
4489 / 2851 / 227
Регистрация: 12.12.2009
Сообщений: 7,244
Записей в блоге: 1
Завершенные тесты: 1
04.02.2012, 18:37     Функция getline не считывает пробелы #24
Цитата Сообщение от Gooman Посмотреть сообщение
Нет. Если в строке есть хоть одно двухзначное число, то она подходит.
Да, я не правильно выразился. Но если мы смотрим в настоящий момент 3х и более значное число, то нет необходимости смотреть 2 предыдущих символа, одного достаточно.

Конечный автомат в стиле "С"
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
    char str[BUFSIZ];
    enum states {find_first, find_second, check_third};
    bool is_valid_str = false;
 
    while (in.getline(str, BUFSIZ)) {
        states state = find_first;
        int i = 0;
 
        while (str[i]) {
            switch(state) {
            case find_first:
                if (isdigit(str[i]) && (i > 0 ? !isdigit(str[i - 1]) : true)) {
                    state = find_second;
                }
                break;
            case find_second:
                if (isdigit(str[i])) {
                    if (str[i+1]) {
                        state = check_third;
                    } else {
                        is_valid_str = true;
                    }
                } else {
                    state = find_first;
                }
                break;
            case check_third:
                if (isdigit(str[i])) {
                    state = find_first;
                } else {
                    is_valid_str = true;
                }
                break;
            }
        
            if (is_valid_str) {
                std::cout << str << std::endl;
                is_valid_str = false;
                break;
            }
            ++i;
        }
    }
Yandex
Объявления
04.02.2012, 18:37     Функция getline не считывает пробелы
Ответ Создать тему
Опции темы

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