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

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

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

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

04.02.2012, 13:41. Просмотров 3357. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.02.2012, 13:41
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Функция getline не считывает пробелы (C++):

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

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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
NoMasters
Псевдослучайный
1754 / 1097 / 72
Регистрация: 13.09.2011
Сообщений: 3,134
04.02.2012, 13:49 #2
Цитата Сообщение от Gooman Посмотреть сообщение
buf[i] < '100'
Здесь ты неправ.
0
Gooman
10 / 10 / 0
Регистрация: 03.10.2010
Сообщений: 350
04.02.2012, 13:50  [ТС] #3
Цитата Сообщение от NoMasters Посмотреть сообщение
Здесь ты неправ.
Я знаю. Исправить нет проблем. Но как же считывать пробелы?!
0
NoMasters
Псевдослучайный
1754 / 1097 / 72
Регистрация: 13.09.2011
Сообщений: 3,134
04.02.2012, 14:00 #4
Всё должно считываться, но в соответствии с if пробелы не выводятся.
0
Gooman
10 / 10 / 0
Регистрация: 03.10.2010
Сообщений: 350
04.02.2012, 14:01  [ТС] #5
Цитата Сообщение от NoMasters Посмотреть сообщение
Всё должно считываться, но в соответствии с if пробелы не выводятся.
Спасибо, теперь понятно. Буду исправлять.
0
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 1
04.02.2012, 14:03 #6
Gooman, это же не компилируемый код! Покажи в том виде, в котором компилируешь. А проблема не с считываением, а с выводом.

Добавлено через 36 секунд
опоздал
0
Gooman
10 / 10 / 0
Регистрация: 03.10.2010
Сообщений: 350
04.02.2012, 14:03  [ТС] #7
Цитата Сообщение от Kastaneda Посмотреть сообщение
Gooman, это же не компилируемый код! Покажи в том виде, в котором компилируешь. А проблема не с считываением, а с выводом.
У меня это компилируемый код. В этом самом виде и компилирую.
0
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 1
04.02.2012, 14:06 #8
Цитата Сообщение от Gooman Посмотреть сообщение
У меня это компилируемый код. В этом самом виде и компилирую.
fout в stdafx.h чтоли объявлен?
0
Gooman
10 / 10 / 0
Регистрация: 03.10.2010
Сообщений: 350
04.02.2012, 15:09  [ТС] #9
Цитата Сообщение от Kastaneda Посмотреть сообщение
fout в stdafx.h чтоли объявлен?
Нужно убрать строчку с закрытием файла fout.

Добавлено через 1 час 0 минут
Кто-нибудь может помочь? Уже по-разному пробовал и остановился на таком вот варианте. Но ничего не выводится.
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
#include "stdafx.h"
#include "iostream"
#include "fstream"
//#include "stdio.h"
using namespace std;
 
void readfile (char *buf, ifstream fin); // считывает содержимое файла в массив литер buf
 
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;
    } 
 
    // создание выходного потока и открытие файла
    ofstream fout("c:\\projects\\text2.txt", ios::out);
    if(!fout)
    {
        cout << "Can't create output file" << endl;
        system("pause");
        return -1;
    }
 
    char buf[255];
    char lim;
    int i = 0;
    int good_str = 0; // 1, если строка содержит только двузначные цифры
    while (!fin.eof())      // пока не конец файла
    {
        good_str = 0;
        i = 0;
        cout<<endl;
        fin.getline(buf, 255, lim = '\n');  // считать одну строку
        while (buf[i])                      // рассмотреть каждый символ этой строки
        {
            if (buf[i] == '\n')
                continue;
 
            if (buf[i] >= '1' && buf[i] <= '9')             // если текущий символ - цифра
                if (buf[i+1] >= '0' && buf[i+1] <= '9')     // если следующий символ тоже цифра
                    if (buf[i+2] >= '0' && buf[i+2] <= '9') // если и  третий символ - цифра
                        good_str = 0;    // то строка нам не подходит
                    else 
                        good_str = 1;    // иначе число имеет 2 знака, строка подходит.
 
            else
                good_str = 0;
 
            i++;                                    // переместить индекс массива buf вперед
        }
        if (good_str)
            cout << buf;            
    }
    
 
    fin.close();
    fout.close();
    cout << endl;
    cout << endl;
    system("pause");
    return 0;
}
А если убрать строки 51 и 52, то начинает хоть что-то выводиться. Однако выводятся и строки, где есть трехзначные цифры. Что нужно исправить, помогите, пожалуйста
Напомню задание: мне надо было записать в другой файл (вывести на экран) строки, где есть только двухзначные цифры. Ну в строках, естественно, не только цифры, а просто предложения любые.
0
Том Ардер
Модератор
Эксперт по математике/физике
3742 / 2355 / 293
Регистрация: 15.06.2009
Сообщений: 4,219
04.02.2012, 15:39 #10
Цитата Сообщение от Gooman Посмотреть сообщение
двузначные цифры
Цифры и Числа - суть разные вещи
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
bool good_str = false;
while (buf[i] && !good_str)  // рассмотреть каждый символ этой строки 
{ 
  if ( buf[i] == '\n')
     continue; 
  good_str = isdigit(buf[i]) && isdigit(buf[i+1]) && !isdigit(buf[i+2]);  // именно двузначное число
  i++;
} 
 
if (good_str)
{
   cout << buf << endl;
   fout << buf<< endl;
}
0
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 1
04.02.2012, 15:53 #11
Цитата Сообщение от Gooman Посмотреть сообщение
А если убрать строки 51 и 52, то начинает хоть что-то выводиться. Однако выводятся и строки, где есть трехзначные цифры. Что нужно исправить, помогите, пожалуйста
Когда находишь нужную строку, добавь выход из цикла while(), т.е.
C++
1
2
3
4
 else {
   good_str = 1;    // иначе число имеет 2 знака, строка подходит.
   break;
}
иначе строка смотриться дальше и значение good_str скорее всего меняется.
Еще перед просмотром очередного символа проверь, является ли i валидным, т.е. ну будет ли выхода за пределы массива. Если i будет равно strlen(buf)-1, то в условии if(buf[i + 2] ...) будет выход за пределы массива.

Еще нет смысла проверять является ли текущий символ символом '\n', т.к. getline() не записывает его в строку.

Так же советую использовать фигурные скобки во всех if'ах (а так же в for'ах и while'ях). Это придает бОльшую читабельность и позволяет легко редактировать код.
Например в 51 строке создается впечатление, что else относится к if'у из 44 строки, а в действительности из 45ой (хотя это скорее вопрос правильного форматирования кода)
0
Gooman
10 / 10 / 0
Регистрация: 03.10.2010
Сообщений: 350
04.02.2012, 15:58  [ТС] #12
Том Ардер, ну вы очень легко поступили, пользуясь встроенной нестандартной функцией. А как без нее сделать?
0
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 1
04.02.2012, 16:00 #13
Цитата Сообщение от Gooman Посмотреть сообщение
пользуясь встроенной нестандартной функцией
Это стандартная функция. Кстати в коде Том Ардер занчение i тоже не проверяется.
0
Gooman
10 / 10 / 0
Регистрация: 03.10.2010
Сообщений: 350
04.02.2012, 16:00  [ТС] #14
Цитата Сообщение от Kastaneda Посмотреть сообщение
Это стандартная функция. Кстати в коде Том Ардер занчение i тоже не проверяется.
Стандартная функция чего? Visual studio?
И если там break поставить, то строка дальше смотреться не будет. Т.е. если встретили где-то в первом месте число 25, прервали цикл. А в той же строке дальше может идти число 325. Получается, что выведется ненужная строка.
0
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 1
04.02.2012, 16:07 #15
Цитата Сообщение от Gooman Посмотреть сообщение
Стандартная функция чего? Visual studio?
Языков С/С++.
isdigit()

Добавлено через 3 минуты
Цитата Сообщение от Gooman Посмотреть сообщение
И если там break поставить, то строка дальше смотреться не будет. Т.е. если встретили где-то в первом месте число 25, прервали цикл. А в той же строке дальше может идти число 325. Получается, что выведется ненужная строка.
Угу, тогда смотри еще предыдущий символ)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.02.2012, 16:07
Привет! Вот еще темы с ответами:

Функция getline - C++
Добрый вечер. Очень долго пытался найти в чём проблема в работе программы-она выдавала немного не то значение,которые было необходимо.Ни...

Функция С++ getline() - C++
Здравствуйте! Скажите пожалуйста, каков смысл функции cin.getline(). Если не сложно,приведите пожалуйста пример.

Функция getline - C++
Делаю упражнение по С++ (консольное приложение). Необходимо считать строку, включая пробелы. Вот описание класса: class employee { ...

Не работает функция getline(); - C++
Помогите, после ввода в переменную int c не выполняется функция getline, программа ее просто пропускает. #include &lt;iostream&gt; using...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
04.02.2012, 16:07
Ответ Создать тему
Опции темы

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