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

Как используя потоки читать файл пропуская текстовые вставки - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
Whiteha
Программист
33 / 33 / 4
Регистрация: 08.07.2011
Сообщений: 190
Записей в блоге: 1
31.10.2011, 23:04     Как используя потоки читать файл пропуская текстовые вставки #1
Есть поток привязанный к файлу на чтение и запись.
Каждая строка в файле имеет формат:
сс:мм:чч дд.мм.гггг text1 = XXX1 text2 = XXX2 text3 = XXX3
где textn - текстовая запись которую ненужно читать(для удобства не программного чтения),
а XXXn - число состоящие из 2 или трёх цифр;
Вопрос: как прочитать нужные цифровые значение из файла, пропуская при этом данные текстовые пометки?
P.S.
У меня есть два варианта, но они оба ущербные.
1) Записывать в файл числа разделяя их пробелами(не программное чтение при этом становиться практически невозможным).
2) Я пробовал также использовать буфер для ненужного текста типа:
C++
1
2
char buf[6];
f >> h >> buf >> m >> buf >> s ну и тд ; //(это не работает)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.10.2011, 23:04     Как используя потоки читать файл пропуская текстовые вставки
Посмотрите здесь:

Читать с консола и записать в файл C++
Как правильно открывать файл и записывать/читать из него C++
C++ Используя потоки ввода/вывода в С++
не могу читать файл C++
C++ Текстовые файлы и потоки ввода/вывода
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,512
31.10.2011, 23:25     Как используя потоки читать файл пропуская текстовые вставки #2
Читайте в int переменную в цикле проверяя каждый раз всё ли ок с потоком (ios.good()), если ок - у нас число и мы его используем. Когда не выполнилось условие - значит мы попали на текст тогда мы просто чистим флаги ios потока и читаем следующие данные и т.д.
О флагах потока можете почитать здесь
http://www.cplusplus.com/reference/iostream/ios/good/
Whiteha
Программист
33 / 33 / 4
Регистрация: 08.07.2011
Сообщений: 190
Записей в блоге: 1
01.11.2011, 11:41  [ТС]     Как используя потоки читать файл пропуская текстовые вставки #3
Должно читаться 9 чисел из строки, сделал так:
C++
1
2
3
4
5
6
7
int buf[9];
            for (int i = 0; i < 9 ; )
            {
                f >> buf[i];
                if (!f.good()) f.clear();
                else ++i;
            }
Но он виснет в бесконечном цикле...

Добавлено через 1 час 17 минут
Может есть в потоках указатель на текущий символ какой, чтобы можно было текст тупо перескакивать инкрементированием указателя (ptr += 4) ? ...
Что ещё можно сделать?

Добавлено через 10 часов 43 минуты
Вообще при определённой подгонке второй метод из тех двух, что я указал в первом посту работает. Так что проблему можно считать решённой, но если вам известно как сделать красивее и эффективнее - пожалуйста отпишитесь!

Добавлено через 15 секунд
Вообще при определённой подгонке второй метод из тех двух, что я указал в первом посту работает. Так что проблему можно считать решённой, но если вам известно как сделать красивее и эффективнее - пожалуйста отпишитесь!
-=ЮрА=-
Заблокирован
Автор FAQ
01.11.2011, 12:46     Как используя потоки читать файл пропуская текстовые вставки #4
Whiteha, заведите структуру с полями
C
1
2
3
4
5
6
7
8
9
10
struct fDATA
{
long sec;
long min;
long hour ;
long day;
long month;
long year;
char text[32];
};
и вот так scanf-те файл
fDATA buf;
C
1
fscanf(f,"%u:%u:%u%u.%u.%u%s",&buf.sec...buf.text);
... - вместо него довбивать ссылки на поля структуры...

Добавлено через 2 минуты
Цитата Сообщение от Whiteha Посмотреть сообщение
Должно читаться 9 чисел из строки, сделал так:
Код C++
int buf[9];
* * * * * * * * * * * * for (int i = 0; i < 9 ; )
* * * * * * * * * * * * {
* * * * * * * * * * * * * * * * f >> buf[i];
* * * * * * * * * * * * * * * * if (!f.good()) f.clear();
* * * * * * * * * * * * * * * * else ++i;
* * * * * * * * * * * * }
- для простоты уберите ваши проверки и сделайте так
C++
1
2
for (int i = 0; i < 9 && !f.eof();i++ )
       f >> buf[i];
Whiteha
Программист
33 / 33 / 4
Регистрация: 08.07.2011
Сообщений: 190
Записей в блоге: 1
01.11.2011, 13:14  [ТС]     Как используя потоки читать файл пропуская текстовые вставки #5
Класс для даты у меня уже есть и изначально у меня всё через С систему и было сделано на fscanf(), fprintf(). Я их нахожу очень удобными и негодую почему не сделали аналог для потоковых объектов, но в данной ситуации задача реализовать чтение именно по средством чтения из потока f >>...
В общем для моего формата строки я использовал такую конструкцию:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
dt = new DAT();
 
            int s = 0, m = 0, h = 0, D = 0, M = 0, Y = 0;
            char buf1, buf2[7];
            //Собственно чтение из потока
            f >>
                h >> buf1>> m >> buf1 >> s >>
                D >> buf1 >> M >> buf1 >> Y >>
                buf2 >> buf1 >> SYS >>  // buf2, buf1 - для пропуска имени переменной в файле и пропуска знака =
                buf2 >> buf1 >> DIA >>
                buf2 >> buf1 >> Pulse;
 
            dt->set_hh(h);
            dt->set_mm(m);
            dt->set_ss(s);
            dt->set_DD(D);
            dt->set_MM(M);
            dt->set_YY(Y);
-=ЮрА=-
Заблокирован
Автор FAQ
01.11.2011, 13:30     Как используя потоки читать файл пропуская текстовые вставки #6
Вот и вся любовь
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
#include <iostream>
#include <fstream>
using namespace std;
struct fDATA
{
    long sec;
    long min;
    long hour ;
    long day;
    long month;
    long year;
    char text[32];
};
 
int main()
{
    fDATA p;
    ifstream ifs("test.txt");
    char chr1, chr2, chr3, chr4;
    //Г±Г±:ìì:Г·Г· ää.ìì.ГЈГЈГЈГЈ text1
    while(!ifs.eof())
    {
        ifs>>p.sec>>chr1>>p.min>>chr2>>p.hour>>p.day>>chr3>>p.month>>chr4>>p.year>>p.text;
        cout<<p.sec<<chr1<<p.min<<chr2<<p.hour<<" "<<p.day<<chr3<<p.month<<chr4<<p.year<<" "<<p.text<<"\n";
    }
    ifs.close();
    system("pause");
    return 0;
}
test.txt
11:22:11 1:2:2011 string1
11:33:11 2:3:2012 string2
11:22:00 2:4:2012 string3
Миниатюры
Как используя потоки читать файл пропуская текстовые вставки  
Whiteha
Программист
33 / 33 / 4
Регистрация: 08.07.2011
Сообщений: 190
Записей в блоге: 1
01.11.2011, 14:40  [ТС]     Как используя потоки читать файл пропуская текстовые вставки #7
Ну собственно вы так же и написали, только изменили формат последних трёх записей, и запись у вас идёт сразу в объект, а не через интерфейс как у меня. Ну если иных предложений по организации считывания кроме как с использованием буфферных переменных для текста никто не знает тогда тему можно считать решённой.
igorrr37
 Аватар для igorrr37
1594 / 1222 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 7
01.11.2011, 15:17     Как используя потоки читать файл пропуская текстовые вставки #8
Цитата Сообщение от Whiteha Посмотреть сообщение
1) Записывать в файл числа разделяя их пробелами
считать из файла и всё ненужное заменить пробелом
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
#include <iostream>
#include <string>
#include <cctype>
#include <sstream>
 
int main () {
    std::string s("сс:мм:чч дд.мм.гггг text = 111 text = 222 text = 333");
    std::size_t size = s.size();
    for(int i = 0; i < size; ++i)
    {
        if(!isdigit(s[i]))
        {
            s[i] = ' ';
        }
    }
    std::istringstream ist(s);
    while(true)
    {
        ist >> s;
        if(s.empty()) break;
        else
        {
            std::cout << s << std::endl;
        }
        s.clear();
    }
    return 0;
}
Добавлено через 16 минут
или искать знак равно
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <string>
#include <sstream>
 
int main () {
    std::string s("сс:мм:чч дд.мм.гггг text = 111 text = 222 text = 333");
    int num;
    std::string::size_type ind = 0;
    std::istringstream ist;
    while((ind = s.find("=")) != std::string::npos)
    {
        s.erase(0, ind + 1);
        ist.str(s);
        ist >> num;
        std::cout << num << std::endl;
    }
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.11.2011, 16:44     Как используя потоки читать файл пропуская текстовые вставки
Еще ссылки по теме:

Как из С++ передать данные в текстовый файл? и как читать текстовые файлы в С++? C++
C++ Текстовый файл читать построчно
C++ Как убрать возможность прочитать вшитые в исполняемый файл текстовые данные

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

Или воспользуйтесь поиском по форуму:
-=ЮрА=-
Заблокирован
Автор FAQ
01.11.2011, 16:44     Как используя потоки читать файл пропуская текстовые вставки #9
Цитата Сообщение от Whiteha Посмотреть сообщение
Ну если иных предложений по организации считывания кроме как с использованием буфферных переменных для текста никто не знает тогда тему можно считать решённой.
- как по мне лучше считать текст в буферную переменную на много легче чем парсить по символу файл, а там уже вам видней
Yandex
Объявления
01.11.2011, 16:44     Как используя потоки читать файл пропуская текстовые вставки
Ответ Создать тему
Опции темы

Текущее время: 02:17. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru