С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
Программист
33 / 33 / 8
Регистрация: 08.07.2011
Сообщений: 190
Записей в блоге: 1

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

31.10.2011, 23:04. Показов 2161. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть поток привязанный к файлу на чтение и запись.
Каждая строка в файле имеет формат:
сс:мм:чч дд.мм.гггг 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 ну и тд ; //(это не работает)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.10.2011, 23:04
Ответы с готовыми решениями:

Как из С++ передать данные в текстовый файл? и как читать текстовые файлы в С++?
Задача такая: у меня есть текстовый файл, в котором из матлаба передано некоторое число N. как теперь это число прочитать? потом...

Используя указатель, как параметр цикла, распечатать массив с конца, пропуская элементы, кратные 3
Создать целочисленный массив из 10 элементов. Используя указатель в качестве параметра цикла: распечатать массив с конца, пропуская...

Определить строки этого файла, содержащие максимальную по длине подстроку, состоящую из одинаковых символов
вот задание для программы: 6. Задан текстовый файл input.txt. Требуется определить строки этого файла, содержащие максимальную по длине...

8
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
31.10.2011, 23:25
Читайте в int переменную в цикле проверяя каждый раз всё ли ок с потоком (ios.good()), если ок - у нас число и мы его используем. Когда не выполнилось условие - значит мы попали на текст тогда мы просто чистим флаги ios потока и читаем следующие данные и т.д.
О флагах потока можете почитать здесь
http://www.cplusplus.com/refer... /ios/good/
1
Программист
33 / 33 / 8
Регистрация: 08.07.2011
Сообщений: 190
Записей в блоге: 1
01.11.2011, 11:41  [ТС]
Должно читаться 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 секунд
Вообще при определённой подгонке второй метод из тех двух, что я указал в первом посту работает. Так что проблему можно считать решённой, но если вам известно как сделать красивее и эффективнее - пожалуйста отпишитесь!
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
01.11.2011, 12:46
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];
0
Программист
33 / 33 / 8
Регистрация: 08.07.2011
Сообщений: 190
Записей в блоге: 1
01.11.2011, 13:14  [ТС]
Класс для даты у меня уже есть и изначально у меня всё через С систему и было сделано на 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);
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
01.11.2011, 13:30
Вот и вся любовь
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
Миниатюры
Как используя потоки читать файл пропуская текстовые вставки  
0
Программист
33 / 33 / 8
Регистрация: 08.07.2011
Сообщений: 190
Записей в блоге: 1
01.11.2011, 14:40  [ТС]
Ну собственно вы так же и написали, только изменили формат последних трёх записей, и запись у вас идёт сразу в объект, а не через интерфейс как у меня. Ну если иных предложений по организации считывания кроме как с использованием буфферных переменных для текста никто не знает тогда тему можно считать решённой.
0
 Аватар для igorrr37
2872 / 2019 / 991
Регистрация: 21.12.2010
Сообщений: 3,750
Записей в блоге: 10
01.11.2011, 15:17
Цитата Сообщение от 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;
}
1
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
01.11.2011, 16:44
Цитата Сообщение от Whiteha Посмотреть сообщение
Ну если иных предложений по организации считывания кроме как с использованием буфферных переменных для текста никто не знает тогда тему можно считать решённой.
- как по мне лучше считать текст в буферную переменную на много легче чем парсить по символу файл, а там уже вам видней
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.11.2011, 16:44
Помогаю со студенческими работами здесь

Сохранение/чтение в нетипизированный файл массива используя потоки
Здравствуйте, необходима помощь, так как не понимаю использования потоков, сделал без них, преподаватель сказал переделать, а так же...

Текстовые потоки
import java.io.FileReader; import java.io.BufferedReader; import java.io.PrintWriter; import java.io.IOException; public class...

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

Как читать файл...
Скажите как читать вложенный (без его извлечения!!!) в форму файл (напр: картинку , чтоб на при нажатие на батон она...

Как читать файл построчно
Здравствуйте, из названия понятно, что мне требуется прочитать .txt файл построчно. В файле лежат: (пример) -0.1993527820828308 ...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru