LINUX.ORG.RU

fstream


0

2

Для работы с файлами я всегда использовал сишные fopen/fwrite/fread и т.п.
Фактически запись представляла собой подготовку большого массива байт и скармливание его fwrite, а чтение данных — вычитка в память содержимого файла и унылейший парсинг (поиск меток, проскакивание N-ного количества байт и прочее).
И тут я вспомнил, что пишу-то на С++:)
Посмотрел в сторону fstream.
И не понял, чем он мне может помочь.
У меня есть небольшой класс, состояние которого мне надо сохранять, а потом восстанавливать.
При работе с fstream я получаю тупое нагромождение данных. Более того — int переводится в десятичный вид.
Парсингу такая бредятина не поддаётся.

Я вот что хочу спросить:
fstream лишь тупая альтернатива fopen или может-таки упростить парсинг?
Ага, вопрос тупой, но мне сейчас проще спросить и, если ответ положительный, начать экспериментировать. Или, если ответ отрицательный, вернуться к Си-функциям и не мучаться...

★★☆

Последнее исправление: Stahl (всего исправлений: 1)

При работе с fstream я получаю тупое нагромождение данных. Более того — int переводится в десятичный вид.

без примера данных и их представления это все выглядит как унылый троллинг. парсинг упростит.

x0r ★★★★★
()
Ответ на: комментарий от x0r

Да на ЛОРе всё выглядит как троллинг.
Ну например есть класс, из которого меня интересует лишь std::string в котором(«гравицапа») и int в котором (100500).
В выходном файле я получу «гравицапа100500».
Да, мне ничего не мешает при выводе выводить также и разделители.
Но тогда это мало чем отличается от сишного подхода.

Ладно. Давай попробуем по-конкретней и с разделителями.
stream << int << «\t»<< std::string << «\n»;
stream.flush();

Ок. Вывели.
А теперь как прочитать?

Stahl ★★☆
() автор топика
Ответ на: комментарий от Stahl
#include <fstream>
#include <iostream>
#include <string>

int main() {
    std::ofstream fo("/tmp/dump");
    fo << 14 << "azaza";
    fo.close();

    int n;
    std::string s;

    std::ifstream fi("/tmp/dump");
    fi >> n >> s;
    fi.close();

    std::cout << "int: " << n << std::endl
              << "string: " << s << std::endl;
    return 0;
}
x0r ★★★★★
()
Ответ на: комментарий от x0r

Плохо.
fo << 14 << «1azaza»;
Приводит к 141 и azaza;

Сейчас попробую разделители вхреначить...

Stahl ★★☆
() автор топика
Ответ на: комментарий от Reset

А что надо использовать для несложных вещей?
Имеется в виду, что есть в стандартной плюсовой либе?

Stahl ★★☆
() автор топика
Ответ на: комментарий от Reset

Да какая разница откуда будут браться данные?
Я просто надеялся, что istream мне поможет с парсингом.
И по идее что-то он может.
Надо проводить эксперименты.

Stahl ★★☆
() автор топика
Ответ на: комментарий от Stahl

stream << int << «\t»<< std::string << «\n»; stream.flush();

Кстати, на будущее - endl вызывает flush. То есть неумеренное его использование отражается на производительности.

anonymous
()
Ответ на: комментарий от anonymous

endl вызывает flush

Нихрена себе!
Не верю. Но проверю:)

То-то меня какой-то сишный маразм подталкивал использовать «\n» вместо std::endl :)

Stahl ★★☆
() автор топика
Ответ на: комментарий от x0r

\n не переносимо

Никакой разницы с endl в смысле переносимости. man text/binary mode

anonymous
()
Ответ на: комментарий от Stahl

Ты бы лучше спросил, что он пил с утра и о чём он говорит :)

Да не, он судя по всему говорит про Love5an. Мне вот и интересно, когда он такое писал и где можно прочитать.

edigaryev ★★★★★
()

просто ты подходишь к плюсам как Си-с-классами. А в том огороде принято делать всё через жоОО и шаблоны абстрагируясь от реальности. То есть для тех-же целей придётся освоить boost spirit и породить пачку шаблонов и хотя-бы пару классов.

MKuznetsov ★★★★★
()
Последнее исправление: MKuznetsov (всего исправлений: 1)

Каким хреном другой интерфейс к I/O должен был упростить парсинг файла? Как минимум указывай формат файла(текстовый или двоичный). Что значит, что int переводится в десятичный вид?

Парсингу такая бредятина не поддаётся.

Как и твой пост. Хотя fstream то ещё говнище.

frozenix ★★★
()
Ответ на: комментарий от frozenix

Каким хреном

Ну так я и спрашиваю fstream это просто хрень для чтения\записи в файл или может ещё и парсить умеет.

формат файла

Да какая разница? Сегодня мне надо одно, завтра другое...

Как и твой пост.

Мне жаль, но ты единственный кто меня не понял.
А если бы я мог абсолютно чётко и внятно спросить, то думаешь я припёрся бы на ЛОР?

Stahl ★★☆
() автор топика
Ответ на: комментарий от Stahl

Чего про int забыл?

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

frozenix ★★★
()

Судя по тому, что в ОПе несколько раз употребляется слово «парсинг», тебе нужен какой-то текстовый формат с грамматикой. fstream пишет данные почти в сыром виде (в бинарном формате - полностью в сыром). Если тебе нужен читабельный формат - взгляни на JSON, XML YAML и прочий boost.

Если ты всё же силился сказать, что хочешь записывать бинарные данные и читать их обратно, «как в pure C», открой мануал по fstream и ВНИМАТЕЛЬНО почитай про openmode.

Вопрос для двухзвёздочного просто идиотский. Если ты не пьян, конечно.

E ★★★
()

В случае бинарных данных

поиск меток

while && getc

проскакивание N-ного количества байт

tellg/seekg

E ★★★
()

В с++ вообще все, что используется с оператором «<<» говно. Я всегда сишный ввод/вывод пользую.

Deleted
()
Ответ на: В случае бинарных данных от E

«как в pure C»

Да я, блин, надеялся, что плюсы помогут мне этот код написать с меньшим геморроем.
«Как в pure C» я могу и на Си написать.

Короче, забейте.
Я кажется понял что делать.
И плюсы мне, вроде бы, могут помочь.
Кода, правда, будет больше, но он будет в дохрена раз проще.

Stahl ★★☆
() автор топика
Ответ на: комментарий от Deleted

Я всегда сишный ввод/вывод пользую

Э? Ты медик? Так почему ты спрашивал недавно про болезни позвоночника на ЛОРе, да ещё и в толксах?
Спросил бы у коллег...

Stahl ★★☆
() автор топика
Ответ на: комментарий от Stahl

Э? Ты медик? Так почему ты спрашивал недавно про болезни позвоночника на ЛОРе, да ещё и в толксах?

Через пол года буду программистом. А спрашивал по тому, что в городе нет ни одного нормального ортопеда, все пидарасы. Ни один нормального лечения не назначил, ни один не спросил симптомы (это вообще толсто) и всем пох"й.

Deleted
()
Последнее исправление: Bizun (всего исправлений: 1)
Ответ на: комментарий от Deleted

Я просто ткнул тебя носом в слово «пользую».
Это старый вариант современного «оказываю медицинскую помощь», а ты хотел сказать «использую».

Stahl ★★☆
() автор топика
Ответ на: комментарий от Deleted

колледже

Не поможет. В школе надо было учить язык. В ПТУ уже не научат:)

Ладно. Хватит. Поржали — пора и честь знать.:)

Stahl ★★☆
() автор топика
Ответ на: комментарий от Stahl

Ладно. Хватит. Поржали — пора и честь знать.:)

Так точно!

Deleted
()

ЕМНИП у него была проблема с открыванием длинных файлов (т.е. он их не могу открывать) и те, кто пытался на с++ писать что-то для работы с видео, например, тихо матюкались и возвращались к старым добрым сишным рабочим способам.

anonymous
()

правильные слова: c++ fstream serialize

anonymous
()

Для работы с файлами я всегда использовал сишные fopen/fwrite/fread и т.п.
Фактически запись представляла собой подготовку большого массива байт и скармливание его fwrite, а чтение данных — вычитка в память содержимого файла и унылейший парсинг (поиск меток, проскакивание N-ного количества байт и прочее).

А почему не fprintf и fscanf?

Waterlaz ★★★★★
()
Ответ на: комментарий от E

Плюсую ваш комментарий. У меня тоже сложилось впечатление, что автору нужна сериализация данных.

Но для этого лучше использовать никак не fstream с парсингом в ручном режиме, а готовые библиотеки, которые сами умеют сохранять, читать, парсить xml/json/etc

В линуксе вроде libxml2 и libexpat этим занимались, если мне не изменяет память.

elijah_sd
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.