Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.81/37: Рейтинг темы: голосов - 37, средняя оценка - 4.81
10 / 10 / 4
Регистрация: 03.10.2010
Сообщений: 350

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

04.02.2012, 13:41. Показов 8552. Ответов 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
Ответ Создать тему
Новые блоги и статьи
10 сукцессия. Питон код войны грибов и растений
anaschu 27.06.2026
import numpy as np class PlantAgent: def __init__(self, name, strategy, initial_biomass): self. name = name self. strategy = strategy # "greedy" (широколиственные) или. . .
сукцессия 9. Математика подлости: как растения предали грибных друзей
anaschu 27.06.2026
Статья 2. Глобальная фосфорная война: эволюционно-экономические механизмы распределения биомов Земли Введение: Экологический рынок как игра с нулевой суммой Традиционная экология долгое время. . .
сукцессия 8. Как я спорил с ИИ, которые - агенты растений и ненавистники грибов!
anaschu 27.06.2026
Статья 1. Хроники грибного восстания: как Сократов диалог разрушил академические догмы ИИ Введение: Синдром «цифрового учебника» Современные большие языковые модели (LLM) обладают колоссальным. . .
Главный вопрос моделирования сукцессии
anaschu 27.06.2026
главный вопрос. Если эктомикориза лучше добывает недоступный фосфор. И ее масса максимальна из всех. А широколиственный лес тоже имеет самую крутую биомассу. То почему не возникло их симбиоза? Это. . .
сукцессия 6. Питон реализация энилоджиковской модели, картинка про Центральную часть будущей модели
anaschu 26.06.2026
Етить. ИИ мне на основе моего старого файла R создал вот эту вот хмерь на пайтоне. Это уже новая модель, модель сукцессии грибной. потоки фосфора, азота. Углерода. 5 видов организмов. Я даже. . .
Как замкнутый ядерный цикл решит проблему недостатки фосфора? Био миграция фосфора со дна океана
anaschu 26.06.2026
Биологический лифт: Концепция подъема фосфора со дна океана с помощью ЗЯТЦ Предлагаю на обсуждение альтернативу тяжелому промышленному бурению океанического дна. Вместо сложной инженерии мы можем. . .
сукцессия 5
anaschu 26.06.2026
ПЛАН РАЗРАБОТКИ математической модели сукцессии микоризных систем Переход AM → EcM (Endo + ErM) · Шумилов А. С. · ИФХиБПП РАН · Пущино · 2026 . . .
сукцессия 4
anaschu 25.06.2026
Более детализированный план разработки План доработки модели динамики микоризных симбиозов (EcM с гистерезисом) Цель: Реализовать логику переключения между эрикоидным (ErM) и эктомикоризным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru