111 lines
5.5 KiB
Markdown
111 lines
5.5 KiB
Markdown
[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 "31 Input/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 "31 Input/output library") or
|
||
as an overriding virtual function of any class declared in [[input.output]](input.output "31 Input/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 "31 Input/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.4 char_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 "31 Input/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.10 character 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.8 String-based streams"), [[file.streams]](file.streams "31.10 File-based streams")), stream buffer
|
||
object ([[stream.buffers]](stream.buffers "31.6 Stream buffers")), or C Library stream ([[c.files]](c.files "31.13 C library files")) by multiple threads may result in
|
||
a data race ([[intro.multithread]](intro.multithread "6.10.2 Multi-threaded executions and data races")) unless otherwise specified ([[iostream.objects]](iostream.objects "31.4 Standard 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.2 Multi-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)
|