10 / 10 / 4
Регистрация: 03.10.2010
Сообщений: 350

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

04.02.2012, 13:41. Показов 8578. Ответов 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;
}
Можете подсказать, как с помощью этой функции считывать и пробелы. Или может другая функция существует?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.02.2012, 13:41
Ответы с готовыми решениями:

Функция getline считывает несколько строк из файла, игнорируя символ новой строки
Всем доброго дня! В С++ я новичок, сам себе придумываю задачки, просто для тренировки. Столкнулся с непонятным для меня поведением...

Getline() не считывает
void Anket::Add() //Функция добавления элементов в список { profile *temp = new profile; cout &lt;&lt; &quot;Введите образование, (Начальное,...

Getline не считывает строку целиком
getline в string не хочет считывать полностью строку, а только до первого пробела. #include &quot;stdafx.h&quot; #include...

23
10 / 10 / 4
Регистрация: 03.10.2010
Сообщений: 350
04.02.2012, 17:56  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Kastaneda Посмотреть сообщение
Одного предыдущего символа и двух следующих будет достаточно, т.к. если число из 3х и более цифр, то строка уже не подходит.
Нет. Если в строке есть хоть одно двухзначное число, то она подходит.
0
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
04.02.2012, 17:56
если писать в стиле "С", то я бы сделал через конечный автомат.
0
10 / 10 / 4
Регистрация: 03.10.2010
Сообщений: 350
04.02.2012, 17:57  [ТС]
В общем, я вот так написал:

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;
        }
    }
Но оно выводит и строки, где есть только трехзначные и более числа.
0
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
04.02.2012, 18:37
Цитата Сообщение от 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;
        }
    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.02.2012, 18:37

Не считывает одну строку из файла с getline()
string s; char l; ifstream file1; file1.open(&quot;in_1.dat&quot;, ios::in); cout &lt;&lt; &quot;ФАЙЛ 1\n\n&quot;; while (!file1.eof()) { ...

Некорректно считывает структуру с cin.getline
вопрос про cin.getline когда ввожу спомощью cin.getline после 1ого ввода с нажатием &quot;в&quot; пропускается ввод 1 элемента структуры(имя) и...

Почему stream.getline считывает до пробела?
Задание: удалить все адреса изображений в html-файле (в теге img значение атрибута src заменить на пустое). void...

Почему getline не считывает строку при первом проходе цикла?
В данной функции: void ArrayStr::InputArr(void) { cout &lt;&lt; &quot;Введите строки длинной не более &quot; &lt;&lt; range &lt;&lt; &quot;...

Программа не считывает пробелы
Программа воспринимает текст только до пробела, если поставил пробел игнорирует. Думаю проблема в этой строчке. cin.get(); ...


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

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
Опции темы

Новые блоги и статьи
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru