mirror of
https://github.com/nlohmann/json.git
synced 2026-08-08 10:13:20 +00:00
fix: leave the character that terminates a number in the input
Read the character following a number without consuming it, instead of consuming it and putting it back. input_stream_adapter now peeks with sgetc() and only steps over the character when the next one is requested or when the adapter is destroyed, so releasing it cannot fail - no putback position is required from the streambuf. Suggested by gregmarr in #5344. Signed-off-by: Niels Lohmann <mail@nlohmann.me>
This commit is contained in:
@@ -51,11 +51,8 @@ input >> j3; // j3 == [2]
|
||||
number was immediately followed by another value: reading `1true` yielded `1` and left the stream at `rue`.
|
||||
Values had to be separated by whitespace to work around this.
|
||||
|
||||
The terminating character is now returned to the stream, so no separator is required. Code that relied on the
|
||||
extra byte being swallowed will observe it again.
|
||||
|
||||
If the stream's `#!cpp std::streambuf` cannot put the character back (its `pbackfail` fails, which does not happen
|
||||
for `#!cpp std::stringbuf` or `#!cpp std::filebuf`), the character is lost as before.
|
||||
The terminating character is now only looked at and left in the stream, so no separator is required. Code that
|
||||
relied on the extra byte being swallowed will observe it again.
|
||||
|
||||
Note that reading concatenated values does **not** work for [JSON Lines](../features/parsing/json_lines.md)
|
||||
(newline-delimited JSON) input -- see that page for why and for the recommended alternative.
|
||||
|
||||
Reference in New Issue
Block a user