Files
cppdraft_translate/cppdraft/iostreams/requirements.md
2025-10-25 03:02:53 +03:00

111 lines
5.5 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[iostreams.requirements]
# 31 Input/output library [[input.output]](./#input.output)
## 31.2 Iostreams requirements [iostreams.requirements]
### [31.2.1](#iostream.limits.imbue) Imbue limitations [[iostream.limits.imbue]](iostream.limits.imbue)
[1](#iostream.limits.imbue-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iostreams.tex#L44)
No function described in [[input.output]](input.output "31Input/output library") except forios_base::imbue and basic_filebuf::pubimbue causes any instance ofbasic_ios::imbue orbasic_streambuf::imbue to be called[.](#iostream.limits.imbue-1.sentence-1)
If any user function called from a function declared in [[input.output]](input.output "31Input/output library") or
as an overriding virtual function of any class declared in [[input.output]](input.output "31Input/output library") callsimbue,
the behavior is undefined[.](#iostream.limits.imbue-1.sentence-2)
### [31.2.2](#stream.types) Types [[stream.types]](stream.types)
[🔗](#lib:streamoff)
`using streamoff = implementation-defined;
`
[1](#stream.types-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iostreams.tex#L67)
The type streamoff is a synonym for one of the signed basic integral types of
sufficient size to represent the maximum possible file size for the operating system[.](#stream.types-1.sentence-1)[255](#footnote-255 "Typically long long.")
[🔗](#lib:streamsize)
`using streamsize = implementation-defined;
`
[2](#stream.types-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iostreams.tex#L81)
The typestreamsize is a synonym for one of the signed basic
integral types[.](#stream.types-2.sentence-1)
It is used to represent the number of characters transferred in an I/O
operation, or the size of I/O buffers[.](#stream.types-2.sentence-2)[256](#footnote-256 "Most places where streamsize is used would use size_­t in C, or ssize_­t in POSIX.")
[255)](#footnote-255)[255)](#footnoteref-255)
Typically long long[.](#footnote-255.sentence-1)
[256)](#footnote-256)[256)](#footnoteref-256)
Most places where streamsize is used would use size_t in C,
or ssize_t in POSIX[.](#footnote-256.sentence-1)
### [31.2.3](#iostreams.limits.pos) Positioning type limitations [[iostreams.limits.pos]](iostreams.limits.pos)
[1](#iostreams.limits.pos-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iostreams.tex#L97)
The classes of [[input.output]](input.output "31Input/output library") with template argumentscharT andtraits behave as described iftraits::pos_type andtraits::off_type arestreampos andstreamoff respectively[.](#iostreams.limits.pos-1.sentence-1)
Except as noted explicitly below, their behavior whentraits::pos_type andtraits::off_type are other types isimplementation-defined[.](#iostreams.limits.pos-1.sentence-2)
[2](#iostreams.limits.pos-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iostreams.tex#L119)
[*Note [1](#iostreams.limits.pos-note-1)*:
For each of the specializations of char_traits defined in[[char.traits.specializations]](char.traits.specializations "27.2.4char_­traits specializations"),state_type denotes mbstate_t,pos_type denotes fpos<mbstate_t>,
and off_type denotes streamoff[.](#iostreams.limits.pos-2.sentence-1)
— *end note*]
[3](#iostreams.limits.pos-3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iostreams.tex#L128)
In the classes of [[input.output]](input.output "31Input/output library"), a template parameter with namecharT represents a member of the set of types containing char, wchar_t,
and any other implementation-defined
character container types ([[defns.character.container]](defns.character.container "3.10character container type"))
that meet the requirements for a character on which any of
the iostream components can be instantiated[.](#iostreams.limits.pos-3.sentence-1)
### [31.2.4](#iostreams.threadsafety) Thread safety [[iostreams.threadsafety]](iostreams.threadsafety)
[1](#iostreams.threadsafety-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iostreams.tex#L138)
Concurrent access to a stream object ([[string.streams]](string.streams "31.8String-based streams"), [[file.streams]](file.streams "31.10File-based streams")), stream buffer
object ([[stream.buffers]](stream.buffers "31.6Stream buffers")), or C Library stream ([[c.files]](c.files "31.13C library files")) by multiple threads may result in
a data race ([[intro.multithread]](intro.multithread "6.10.2Multi-threaded executions and data races")) unless otherwise specified ([[iostream.objects]](iostream.objects "31.4Standard iostream objects"))[.](#iostreams.threadsafety-1.sentence-1)
[*Note [1](#iostreams.threadsafety-note-1)*:
Data races result in undefined behavior ([[intro.multithread]](intro.multithread "6.10.2Multi-threaded executions and data races"))[.](#iostreams.threadsafety-1.sentence-2)
— *end note*]
[2](#iostreams.threadsafety-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iostreams.tex#L146)
If one thread makes a library call *a* that writes a value to a stream
and, as a result, another thread reads this value from the stream through a
library call *b* such that this does not result in a data race, then*a*'s write synchronizes with*b*'s read[.](#iostreams.threadsafety-2.sentence-1)