Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с символами и строками, switch case 
:(
    Опции темы
Kataklysm
Дата 27.9.2009, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 27.9.2009

Репутация: нет
Всего: нет



Доброе время суток.
Имею текстовый файл с набором символов.

kataklysm@linux-hct1:~/Documents/Education/Информатика/2-1> cat file.dat
Код

s234324l23423dfljgldfjgl3434dfjgldsjgjdfgjdfjgd2kfgjdfgj34dfgjfdkjgdjd
sdlfgjlsfkdjlk32dsfjgdfsjlgedgj34dijgpwejgpjk3fgpjdfgjdf4igjdfgjd2fojg
odgf3ejgdfj3gdfgdisfgoidsfgdfng23iodngudfsngsdngi43dfsngdfngdf3gidfoue
eorigrjg2odifsjgisernguii3neorijguierhgposd3ijguerhgounbgjkdfgigjoiper
3ehgiuerh4jogiewrnhfbjdfmnv4fngiopesrgioerh43guiehoijngjld34snfg9sd43r

Нужно вывести кол-во десятичных чисел по строкам.
Чтение из файла сделал как (прошу сильно не битьsmile)
Код

#include <iostream>                                                                                                                                           
#include <fstream>                                                                                                                                            
#include <stdio.h>                                                                                                                                            
using namespace std;                                                                                                                                          

int main ()
{          
    ifstream infile;
    char p[70];     
    infile.open ("file.dat");
    if (infile==NULL)        
        cout << "Ошибка отрытия файла!"<<endl;
    else                                      
    while (!infile.eof())                     
    {                                         
        infile >> p;                          
        cout << p << endl;                    
    }                                         
    infile.close(); // конец_чтения_файла     
    cout << endl;                             
    cout << "Нажмите любую клавишу для продолжения" << endl;
    getc (stdin); 


Буду очень благодарен. Спасибо.
P.S. Компилятор: gcc version 4.3.2 [gcc-4_3-branch revision 141291] (SUSE Linux)

Это сообщение отредактировал(а) Kataklysm - 27.9.2009, 13:08
PM MAIL   Вверх
zim22
Дата 27.9.2009, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(Kataklysm @  27.9.2009,  13:05 Найти цитируемый пост)
Буду очень благодарен. Спасибо.

пожалуйста. в чём проблема/что не получается?
***
"сделайте за меня" - это в Центр помощи


--------------------
PM MAIL   Вверх
Kataklysm
Дата 27.9.2009, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 27.9.2009

Репутация: нет
Всего: нет



Цитата(zim22 @ 27.9.2009,  13:07)
Цитата(Kataklysm @  27.9.2009,  13:05 Найти цитируемый пост)
Буду очень благодарен. Спасибо.

пожалуйста. в чём проблема/что не получается?
***
"сделайте за меня" - это в Центр помощи

Упс...извиняюсь, что не в ту тему написал.

Нужно вывести кол-во десятичных чисел по строкам.

P.S.Админы/Модераторы перенесите пожалуйста тему и пожалуйста сильно не пинайте. smile
PM MAIL   Вверх
bsa
Дата 27.9.2009, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Если тебе нужен совет по нахождению цифр в потоке данных, то используй условие if ((c >= '0') && (c <= '9')), где c - считанный из файла символ.


M
bsa
Kataklysm, в цент помощи отправляют тех, кто ничего сам не хочет делать. У тебя, как минимум, уже какой-то код есть. Если будешь настаивать перенесу.


PM   Вверх
Kataklysm
Дата 27.9.2009, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 27.9.2009

Репутация: нет
Всего: нет



Цитата(bsa @ 27.9.2009,  17:29)
Если тебе нужен совет по нахождению цифр в потоке данных, то используй условие if ((c >= '0') && (c <= '9')), где c - считанный из файла символ.

bsa За совет спасибо, сейчас буду пробовать.
Ну да, что -то есть, т.к.  стараюсь делать сам, чтобы научится.
P.S. Тогда непереносиsmile. Спасибо.
PM MAIL   Вверх
Kataklysm
Дата 27.9.2009, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 27.9.2009

Репутация: нет
Всего: нет



Что то не получается. Натолкните пожалуйста на мысль.

Код

#include <iostream>
#include <fstream>
#include <stdio.h>
using namespace std;
//Чтение_из_файла
int main ()
{
    ifstream infile;
    char p[70];
    infile.open ("file.dat");
    if (infile==NULL)
        cout << "Ошибка отрытия файла!"<<endl;
    else
    while (!infile.eof())
    {
        infile >> p;
        cout << p << endl;
    }
    infile.close(); // конец_чтения_файла
    cout << endl;
    cout << "Нажмите любую клавишу для продолжения" << endl;
    getc (stdin);
//Подсчет количества десятичных чисел в строке.
    int i,a;
    if ((p[a]>='0')&&(p[a]<='9'))
        {
        a++;
        i++;
        cout << "Количество десятичных чисел в строке:" << i << endl;
        }
    else
        cout << "Нет десятичный чисел в строке!"<< endl;

}


Результат:

Код

s234324l23423dfljgldfjgl3434dfjgldsjgjdfgjdfjgd2kfgjdfgj34dfgjfdkjgdjd
sdlfgjlsfkdjlk32dsfjgdfsjlgedgj34dijgpwejgpjk3fgpjdfgjdf4igjdfgjd2fojg
odgf3ejgdfj3gdfgdisfgoidsfgdfng23iodngudfsngsdngi43dfsngdfngdf3gidfoue
eorigrjg2odifsjgisernguii3neorijguierhgposd3ijguerhgounbgjkdfgigjoiper
3ehgiuerh4jogiewrnhfbjdfmnv4fngiopesrgioerh43guiehoijngjld34snfg9sd43r

Нажмите любую клавишу для продолжения

Количество десятичных чисел в строке:4197537



Ответ уж явно не верен smile
PM MAIL   Вверх
Alexeis
Дата 27.9.2009, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 4
Всего: 459



1я ошибка это не инициализированные переменные.
Перед 
Код

    if ((p[a]>='0')&&(p[a]<='9'))
        {
        a++;
        i++;
        cout << "Количество десятичных чисел в строке:" << i << endl;
        }
    else
        cout << "Нет десятичный чисел в строке!"<< endl;

нужно занулить a и i
2я ошибка. Для перебора нужен цикл. Тут его нету (например while)

3я ошибка тут
Код

  while (!infile.eof())
    {
        infile >> p;
        cout << p << endl;
    }

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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Kataklysm
Дата 27.9.2009, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 27.9.2009

Репутация: нет
Всего: нет



Цитата(Alexeis @ 27.9.2009,  22:49)
1я ошибка это не инициализированные переменные.
Перед 
Код

    if ((p[a]>='0')&&(p[a]<='9'))
        {
        a++;
        i++;
        cout << "Количество десятичных чисел в строке:" << i << endl;
        }
    else
        cout << "Нет десятичный чисел в строке!"<< endl;

нужно занулить a и i
2я ошибка. Для перебора нужен цикл. Тут его нету (например while)

3я ошибка тут
Код

  while (!infile.eof())
    {
        infile >> p;
        cout << p << endl;
    }

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

Попробуем разобраться smile.

P.S. Не совсем конечно понял 
PM MAIL   Вверх
bsa
Дата 27.9.2009, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Kataklysm, попробуй читать из файла посимвольно с помощью std::istream::getc()
PM   Вверх
Kataklysm
Дата 28.9.2009, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 27.9.2009

Репутация: нет
Всего: нет



Чего то добился smile

Код

#include <iostream>
#include <fstream>
using namespace std;

int main ()
{
        char c;
        int i;
        ifstream is;
        is.open ("file.dat");
        //Ошибка открытия файла
        if (is==NULL)
            {cout << "ОШИБКА ОТКРЫТИЯ ФАЙЛА!"<<endl;
            cout << "Нажмите любую клавишу для выхода."<<endl;
            getc (stdin);
            return 0;
            }
        cout <<"Чтение данных из файла:"<<endl;
        while (is.good())
        {
                c=is.get();
                if (is.good())
                        cout <<c;
                if ((c>='0')&&(c<='9')) i++;
                 }
        cout << endl;
        cout <<"Кол-во десятичных чисел: "<< i << endl;
        cout <<endl;
        is.close();
}



Результат, верен:

Код

Чтение данных из файла:
gsf324l23423dfljgldfjgl3434dfjgldsjgjdfgjdfjgd2kfgjdfgj34dfgjfdkjgdjdd
sd4fgjlsfkdjlk32dsfjgdfsjlgedgj34dijgpwejgpjk3fgpjdfgjdf4igjdfgjd2foj6
odgf3ejgdfj3gdfgdisfgoidsfgdfng23iodngudfsngsdngi43dfsngdfngdf3gidfoue
eorigrjg2odifsjgisernguii3neorijguierhgposd3ijguerhgounbgjkdfgigjoiper
3ehgiuerh4jogiewrnhfbjdfmnv4fngiopesrgioerh43guiehoijngjld34snfg9sd43r
Кол-во десятичных чисел: 44



Но как сделать именно "Нужно вывести кол-во десятичных чисел по строкам"? А то у меня пока считает только общее количество символов.
P.S.Намекните пожалуйста smile.
Спасибо.
PM MAIL   Вверх
bsa
Дата 28.9.2009, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Читаешь файл с помощью std::getline() построчно в std::string, затем засовываешь полученную строку в std::stringstream и читаешь уже посимвольно из получившегося потока.
PM   Вверх
Kataklysm
Дата 28.9.2009, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 27.9.2009

Репутация: нет
Всего: нет



bsa, Подскажи пожалуйста, как это примерно написать, а то "до думаться" не могу. Спасибо.
PM MAIL   Вверх
Kataklysm
Дата 28.9.2009, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 27.9.2009

Репутация: нет
Всего: нет



И так...

Код

  while (is.good()) //цикл для извлечения из файла
        {
                c=is.get();
                if (is.good()) //возвращает символ из файла
                 {
                    cout <<c;
                 }
                getline (is,s);
                if ((c>='0')&&(c<='9'))
                 {
                    i++;
                 }
        }


Результат:

Код

Чтение данных из файла:
gsoe3

Кол-во десятичных чисел: 1


Тоесть чтение выполняется по столбцам, а не по по строчкам :(.
Как сделать, чтобы считалось по строкам? Спасибо.
PM MAIL   Вверх
bsa
Дата 28.9.2009, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Код
std::string buf;
while(std::getline(is, buf)) {
    std::stringstream ss(buf);
    char c;
    int cnt = 0;
    while(ss.get(&c)) {
       if ((c >= '0') && (c <= '9'))
          ++cnt;
    }
    std::cout << "Line contains " << cnt << " digits" << std::endl;
}


Это сообщение отредактировал(а) bsa - 28.9.2009, 13:23
PM   Вверх
Kataklysm
Дата 28.9.2009, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 27.9.2009

Репутация: нет
Всего: нет



Цитата(bsa @ 28.9.2009,  14:22)
Код
std::string buf;
while(std::getline(is, buf)) {
    std::stringstream ss(buf);
    char c;
    int cnt = 0;
    while(ss.get(&c)) {
       if ((c >= '0') && (c <= '9'))
          ++cnt;
    }
    std::cout << "Line contains " << cnt << " digits" << std::endl;
}

bsa Спасибо большое.

Только вот не понял функцию "stringstream", что она вообще делает? Объясни пожалуйста. smile

P.S. Хочется понимать smile.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1444 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.