powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / знатокам STL
18 сообщений из 18, страница 1 из 1
знатокам STL
    #33614998
Фотография rodb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос к людям знающим внутреннюю реализацию
std::fstream

На платформе виндовс.
Является ли fstream оберткой над Win32?


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
знатокам STL
    #33615229
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет конечно.
...
Рейтинг: 0 / 0
знатокам STL
    #33615508
Yossarian
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Конечно, да. Не лезет же он на диск читать сектора ? А значит, все, что имеет
дело с системными вызовами Win32 так или иначе является оберткой для Win32.



Irving Washington
...
Рейтинг: 0 / 0
знатокам STL
    #33615541
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я имел в виду, что прямых вызовов WIN32 API там нет. Там скорее всего вызовы <stdio.h>.
...
Рейтинг: 0 / 0
знатокам STL
    #33615580
Фотография rodb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Я имел в виду, что прямых вызовов WIN32 API там нет. Там скорее всего
вызовы <stdio.h>.

попробую угадать.
если реч идет о stdio.h, то там скорее всего обернуты вызова DOS
на ассемблере.



Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
знатокам STL
    #33615722
Фотография Сергей Ильич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rodb

>Я имел в виду, что прямых вызовов WIN32 API там нет. Там скорее всего
вызовы <stdio.h>.

попробую угадать.
если реч идет о stdio.h, то там скорее всего обернуты вызова DOS
на ассемблере.

Какие вызовы ДОС?!!! Не порти мне настроение такими ужасами. На win32 в конце концов дело конечно же упирается в CreateFile()/ReadFile()/WriteFile()
...
Рейтинг: 0 / 0
знатокам STL
    #33619412
Фотография rodb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Ильич

> На win32 в конце концов дело конечно же упирается в
CreateFile()/ReadFile()/WriteFile()

А вы можете показать кусочек реализации
fstream <<
записи в поток.

Я чего-то совсем потерялся, перерыл BCB-ные StlPort заголовки, но до
реализации так и не добрался. в cpp файлах ничего не нашел, да их там не так
много.
Вся реализация убрана кудато -неизвестно куда.

Если напрягаю - то Пожалуста.
Дмитрий.


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
знатокам STL
    #33619460
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Она убрана в C Runtime Library. Что там показывать ? Там вызовы функций из stdio.h или вызовы функций, реализующих в C Runtime Library функции из stdio.h.
...
Рейтинг: 0 / 0
знатокам STL
    #33620053
Фотография Сергей Ильич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rodb

Сергей Ильич

> На win32 в конце концов дело конечно же упирается в
CreateFile()/ReadFile()/WriteFile()

А вы можете показать кусочек реализации
fstream <<
записи в поток.


Если посмотреть fstream.cpp, в stlport, то можно увидеть что он пользуется либо вызовами POSIX типа _open()/_read()/_write(), либо вызовами Win32 типа CreateFile()/ReadFile()/WriteFile(). Это зависит от платформы. Буферизованный ввод-вывод из stdio.h использовать нет смысла - лучше использовать блочные функции ввода-вывода вместе с буфферами имплементированными на С++. StlPort так и делает.
...
Рейтинг: 0 / 0
знатокам STL
    #33620499
Фотография rodb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Одним словом, можно ли утверждать следующее:
На платформе виндовс, использование STL является оберткой над Win32
функциями, доступа к объектам ядра(файлам).
На платформе виндовс, будет оптимальнее доступ к файлам при использовании
прямых вызовов типа CreateFile()/ReadFile()/WriteFile().



Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
знатокам STL
    #33620976
Фотография Сергей Ильич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rodb
Одним словом, можно ли утверждать следующее:
На платформе виндовс, использование STL является оберткой над Win32
функциями, доступа к объектам ядра(файлам).
На платформе виндовс, будет оптимальнее доступ к файлам при использовании
прямых вызовов типа CreateFile()/ReadFile()/WriteFile().

Что такое "оптимальнее"? Все равно 99 процентов времени съест операция ввода-вывода. И как ты объект в файл запишешь? Взять адрес+длину и передать в WriteFile - это неправильно. Писать кусочками по несколько байт (каждое поле отдельно) - тоже неправильно. Правильно скормить все атомарные поля класса в std::ostream, а составным полям этот std::ostream рекурсивно передать чтобы они сделали тоже самое. std::ostream все это дело буферизует и запишет на диск блоками по несколько килобайт. На win32 обычно применяются технологии специфичные для windows типа COM (IPersistFile итд), чтобы приложение интегрировалось в среду более плотно.
...
Рейтинг: 0 / 0
знатокам STL
    #33621482
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rodbОдним словом, можно ли утверждать следующее:
На платформе виндовс, использование STL является оберткой над Win32
функциями, доступа к объектам ядра(файлам).
Более того, любая библиотека будет являться оберткой над Win32 функциями :)
Ты в принципе, не сможешь на Win32 платформе писать что-либо и не использовать Win32 функции.
В зависимости от библиотеки может быть больше или меньше собственных промежуточных вызовов, но в итоге все обязательно сведется к вызову Win32 функций.


rodbНа платформе виндовс, будет оптимальнее доступ к файлам при использовании прямых вызовов типа CreateFile()/ReadFile()/WriteFile().Смотря что считать за оптимум. Если ты сам будешь звать Win32 API, то получишь более полный контроль над файлами. Но потеряешь в переносимости кода.

Например:
Если у тебя есть некий класс UniversalImage имеющий методы SaveAsJPG(), SaveAsBMP() и так далее. Вызывая эти методы в прикладной программе ты вызываешь кучу библиотечного, уже существующего, кода который сконвертирует картинку в соотвествующий формат и через CreateFile()/WriteFile() запишет ее на диск, но во время записи этот файл будет перезаписан вместо существующего. А тебе например хочется чтобы записываемая картинка добавлялась к концу существующего файла (ты делаешь библиотеку картинок). Вот тогда тебе прийдется искать в классе (или писать самому) методы UniversalImage.CompressToJPGInMemory(), UniversalImage.CompressToBMPInMemory() а потом вручную через CreateFile()/WriteFile() дозаписывать в создающуюся библиотеку картинок.



Сергей ИльичНа win32 обычно применяются технологии специфичные для windows типа COM (IPersistFile итд), чтобы приложение интегрировалось в среду более плотно.Это, мягко сказать - неверно :)
...
Рейтинг: 0 / 0
знатокам STL
    #33621611
Фотография Сергей Ильич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlНапример:
Если у тебя есть некий класс UniversalImage имеющий методы SaveAsJPG(), SaveAsBMP() и так далее. Вызывая эти методы в прикладной программе ты вызываешь кучу библиотечного, уже существующего, кода который сконвертирует картинку в соотвествующий формат и через CreateFile()/WriteFile() запишет ее на диск, но во время записи этот файл будет перезаписан вместо существующего. А тебе например хочется чтобы записываемая картинка добавлялась к концу существующего файла (ты делаешь библиотеку картинок). Вот тогда тебе прийдется искать в классе (или писать самому) методы UniversalImage.CompressToJPGInMemory(), UniversalImage.CompressToBMPInMemory() а потом вручную через CreateFile()/WriteFile() дозаписывать в создающуюся библиотеку картинок.

Если библиотечный метод объявлен так:
Код: plaintext
1.
void SaveAsJPG(const std::ostream& stream);
То картинку можно сохранять куда угодно - хоть в память, хоть на диск; надо только передать туда нужного потомка std::ostream.
White Owl
Сергей ИльичНа win32 обычно применяются технологии специфичные для windows типа COM (IPersistFile итд), чтобы приложение интегрировалось в среду более плотно.Это, мягко сказать - неверно :)
Я, конечно, имею в виду профессионально написанный софт. Если UniversalImage - COM класс, то метод сохранения в файл должен выглядеть так:
Код: plaintext
1.
void SaveAsJPG(IStream* stream);
Такой метод будет гибким.
...
Рейтинг: 0 / 0
знатокам STL
    #33621797
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей ИльичЕсли библиотечный метод объявлен так:
Код: plaintext
1.
void SaveAsJPG(const std::ostream& stream);
То картинку можно сохранять куда угодно - хоть в память, хоть на диск; надо только передать туда нужного потомка std::ostream.Это в данном случае не важно. Все равно в стандартном потомке ostream (который fstream) где-то далеко в глубине есть вызовы CreateFile()/WriteFile() с какими-то флагами выставленными по умолчанию.
Если самому использовать CreateFile()/WriteFile() с явно задаными флагами, то можно это объявить хоть классом потомком ostream (этакий MyCoolFStream), хоть набором процедур работающих с буффером в памяти. Все равно в итоге ты получишь более полное управление файлами, с доступом ко всем возможностям предоставляемым ОС. Это будет чуть сложнее в реализации и возможно менее эффективно по скорости работы, но у тебя будет больше возможностей управлять файлом.
...
Рейтинг: 0 / 0
знатокам STL
    #33621924
Фотография Сергей Ильич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MeЕсли библиотечный метод объявлен так:
Код: plaintext
1.
void SaveAsJPG(const std::ostream& stream);

Тут конечно же ошибка - const явно лишний.
White Owl
Это в данном случае не важно. Все равно в стандартном потомке ostream (который fstream) где-то далеко в глубине есть вызовы CreateFile()/WriteFile() с какими-то флагами выставленными по умолчанию.

Во первых не далеко в глубине, там один доп. уровень - буферизация. Во вторых в подавляющем большинстве случаев дефолтовых флагов хватает, тем более что шаринг SGI iostreams настраивают.
White Owl
Если самому использовать CreateFile()/WriteFile() с явно задаными флагами, то можно это объявить хоть классом потомком ostream (этакий MyCoolFStream), хоть набором процедур работающих с буффером в памяти.
Это я не понял. Я писал, что пишущим функциям надо передавать абстрактный поток, чтобы гибко управлять процессом. В Java можно нанизывать потоки один на другой - можно например нанизать ZipOutputStream на Base64OutputStream, а его в свою очередь на ByteArrayOutputStream чтобы получить в памяти позипованный и закодированный base64 документ или передать его в сеть через поток который предоставил URLConnection. Причем пишущий код совсем ничего не знает про то что происходит с тем что он пишет - трансформации определяет пользователь кода. Память и CPU тоже не забиваются - все преобразования происходят по мере поступления данных в поток. В С++ так можно делать через iostreams или COM.
...
Рейтинг: 0 / 0
знатокам STL
    #33622992
Фотография rodb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А входит ли в понятие Win32 использование NTDLL.DLL
для доступа к файлам?

по моим данным, длл-ки Win32 импользуют NTDLL.DLL


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
знатокам STL
    #33623149
Фотография Сергей Ильич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rodbА входит ли в понятие Win32 использование NTDLL.DLL
для доступа к файлам?

по моим данным, длл-ки Win32 импользуют NTDLL.DLL

NTDLL - это по моему Hardware Abstraction Layer, нечто вроде 32-битного BIOS.
...
Рейтинг: 0 / 0
знатокам STL
    #33623178
Фотография rodb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот тут есть картинка

http://khpi-iip.mipk.kharkiv.edu/library/extent/os/os/nt5.html


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / знатокам STL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]