<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/57946>57946</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            `<fstream>`: Potential glitch with `ifstream::peek` in text mode when the file contains LF line endings on Windows
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            libc++,
            platform:windows
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          fsb4000
      </td>
    </tr>
</table>

<pre>
    ```c++
#include <cassert>
#include <fstream>
#include <iostream>
using namespace std;

int main() {
    const char* const filename = "example_file.txt";

    {
        ofstream o(filename, ios_base::binary);
        assert(o.good());
        o << "cute fluffy kittens\n";
    }

    ifstream fin(filename);
    fin.rdbuf()->pubsetbuf(nullptr, 0);
    assert(fin.good());
    cout << "start pos: " << fin.tellg() << '\n';
    assert(fin.good());
    cout << "fin.peek(): " << static_cast<char>(fin.peek()) << '\n';
    assert(fin.good());
    cout << "end pos (expected 0): " << fin.tellg() << '\n';
}
```

```
$ clang-cl.exe --driver-mode=g++ --target=x86_64-pc-windows-msvc -nostdinc++ -I C:/Dev/STL/llvm-project/build/include/c++/v1 -std=c++2b -llibc++experimental -nostdlib -L C:/Dev/STL/llvm-project/build/lib -lc++ -lmsvcrt -lmsvcprt -loldnames -g main.cpp

$ a.exe
start pos: 0
fin.peek(): c
end pos (expected 0): -1
```

Same result with mingw-w64:
```
$ clang++ -stdlib=libc++ main.cpp

$ ./a
start pos: 0
fin.peek(): c
end pos (expected 0): -1
```

clang + libstdc++ gives the zero:
```
$ clang++ main.cpp
$ ./a
start pos: 0
fin.peek(): c
end pos (expected 0): 0
```

without the `fin.rdbuf()->pubsetbuf(nullptr, 0);` the result is also zero.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy9VV2PmzgU_TXwYoHABBIeeJhOdqSV5mGlVurjyJgL8dbYCJsks79-rw1MJmln1FZtEUK2L_Y959wP17p5roIimV8e0A_uTfZBchfQTCgupwZIkN1zZgyMNsj--pa1NXYE1r9hFfrGPBmhOqJYD2ZgHIixTZCtbv1XKEt6JlRAdwEtSbBdrAQfrpWxhB_YGNC7ZdYKCe48dLcnAaVwZv0g4cmtx_ZscenGgzvp6lj36IUI0eh4PTOg9wQpPNXMQJDd4VsLxcZnBPZy5nrAohLd6bjTupnhf-tH7YTB14HlkwXSyqltn8kXYS0oE-T36jXmGe3-loBY8bZeqgvia4dojcemntoZT4SBGKbagJ2X1CTlYEfHM7nd-kLInfE2Ja4n-4qRsWy0ZNAGxXLz1eQOsSBlt8Z13bGdCW9_gW_38wDwZfn5GgACs4I_YTZbl9QuhzApZw-vNv0maKAaJwoOd3AegFtoFsV_UqVLSqwl_DpDbhfphnDJVBdxGcMZSBQ1ozjCGPW6wczed3P54zqGrwNUaH_eFU_FJhp4dBKq0ScT9ebISaSwpBss8XXH3-TelQZ92MMRvx8_PeJXymMfDaP-F5nitJ6ERJ0els6Ao7Xf0IdjSiLfBfbLGq1JJKWol6mTaxQ9KMvk4h2NJHr8Ab9-g3yBLB0TzNJ5MPiRlo3vSiTqfPuJ-TBcKYoSMqfdPL1K80Xlr9OPz4b3gh-l74Txo-trI5hJWnIS9kB67J6n6FRsHPV3I71yneVCdS-KvskvRqnYn-TnkRIHCdEh0hVgh7lpiD0A-Q9G_b1cb2j9JkLJO3xcjFzdO-Ro-vHmWyR-7xJyYQiTRnsR4hCqtCiyssjLbBc2VdaUWclCK6wEf49f3cVufkf-0XijWIGF00lh-WFOIjSKl1_dpeY1QNdCEQtnvH6xKZDTAZQH464Wd9dalNeQxweMlQKCEmEuGqIV-Tz3h3AaZXWwdjBzXeLbobupjrnul9r8ukSFMRMYHOTbclOEh6pt85KndVoXu5pBktab3TZhSdaWUKY1bEPJapCmCnIMOr1ktbszqe-1g2S21aMjt7QuZ8v3oahoQmlS0owmmzzbxRnNiqJo07zY0jTNt8EmAcwiGTuQsR67cKw83nrqDBqlMNZcjHgViE4BeCx4Ppsw_GPVmnqTJEnoqVWe1_9Cf6iH">