[Bug libstdc++/64064] New: basic_filebuf seekoff return value is unusable for files opened in text mode on Windows
lukeallardyce at gmail dot com
gcc-bugzilla@gcc.gnu.org
Tue Nov 25 00:50:00 GMT 2014
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64064
Bug ID: 64064
Summary: basic_filebuf seekoff return value is unusable for
files opened in text mode on Windows
Product: gcc
Version: 4.9.2
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: libstdc++
Assignee: unassigned at gcc dot gnu.org
Reporter: lukeallardyce at gmail dot com
Discussion here
https://gcc.gnu.org/ml/libstdc++/2014-11/msg00145.html
#include <fstream>
#include <iostream>
int main(int, char* argv[])
{
using traits = std::filebuf::traits_type;
using int_type = std::filebuf::int_type;
std::filebuf fb;
fb.open(argv[1], std::ios::in);
while (!traits::eq_int_type(fb.sbumpc(), traits::eof()))
std::cout << fb.pubseekoff(0, std::ios::cur, std::ios::in) << ' ';
std::cout << '\n';
fb.close();
fb.pubsetbuf(nullptr, 0);
fb.open(argv[1], std::ios::in);
while (!traits::eq_int_type(fb.sbumpc(), traits::eof()))
std::cout << fb.pubseekoff(0, std::ios::cur, std::ios::in) << ' ';
}
With the following 3-line Windows-style text file:
hello
world
Produces the following:
4 5 6 7 8 9 10 11 12 13 14 15 16
1 2 3 4 5 7 8 9 10 11 12 14 16
On a buffered stream, the value returned by pubseekoff cannot be used to seek
back to that point due to the way Windows implements the POSIX read and lseek64
functions (i.e. read performs end of line conversion, lseek64 doesn't). The
value is off by one for each unconsumed end of line in the buffer.
It is still unclear whether this should be fixed, if possible, by libstdc++ or
mingw-w64.
More information about the Gcc-bugs
mailing list