1// Copyright (C) 2004-2015 Free Software Foundation, Inc. 2// 3// This file is part of the GNU ISO C++ Library. This library is free 4// software; you can redistribute it and/or modify it under the 5// terms of the GNU General Public License as published by the 6// Free Software Foundation; either version 3, or (at your option) 7// any later version. 8 9// This library is distributed in the hope that it will be useful, 10// but WITHOUT ANY WARRANTY; without even the implied warranty of 11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12// GNU General Public License for more details. 13 14// You should have received a copy of the GNU General Public License along 15// with this library; see the file COPYING3. If not see 16// <http://www.gnu.org/licenses/>. 17 18// { dg-require-fileio "" } 19 20// 27.6.1.3 unformatted input functions 21// NB: ostream has a particular "seeks" category. Adopt this for istreams too. 22// @require@ %-*.tst %-*.txt 23// @diff@ %-*.tst %-*.txt 24 25#include <istream> 26#include <sstream> 27#include <fstream> 28#include <testsuite_hooks.h> 29 30// fstreams 31void test04(void) 32{ 33 typedef std::wistream::off_type off_type; 34 35 bool test __attribute__((unused)) = true; 36 std::wistream::pos_type pos01, pos02, pos03, pos04, pos05, pos06; 37 std::ios_base::iostate state01, state02; 38 const char str_lit01[] = "wistream_seeks-1.txt"; 39 const char str_lit02[] = "wistream_seeks-2.txt"; 40 std::wifstream if01(str_lit01, std::ios_base::in | std::ios_base::out); 41 std::wifstream if02(str_lit01, std::ios_base::in); 42 std::wifstream if03(str_lit02, std::ios_base::out | std::ios_base::trunc); 43 VERIFY( if01.good() ); 44 VERIFY( if02.good() ); 45 VERIFY( if03.good() ); 46 47 std::wistream is01(if01.rdbuf()); 48 std::wistream is02(if02.rdbuf()); 49 std::wistream is03(if03.rdbuf()); 50 51 pos01 = is01.tellg(); 52 pos02 = is01.tellg(); 53 pos03 = is02.tellg(); 54 pos04 = is02.tellg(); 55 pos05 = is03.tellg(); 56 pos06 = is03.tellg(); 57 58 // istream& seekg(pos_type) 59 // istream& seekg(off_type, ios_base::seekdir) 60 61 // cur 62 // NB: see library issues list 136. It's the v3 interp that seekg 63 // only sets the input buffer, or else istreams with buffers that 64 // have _M_mode == ios_base::out will fail to have consistency 65 // between seekg and tellg. 66 state01 = is01.rdstate(); 67 is01.seekg(10, std::ios_base::cur); 68 state02 = is01.rdstate(); 69 pos01 = is01.tellg(); 70 VERIFY( pos01 == pos02 + off_type(10) ); 71 VERIFY( state01 == state02 ); 72 pos02 = is01.tellg(); 73 VERIFY( pos02 == pos01 ); 74 75 state01 = is02.rdstate(); 76 is02.seekg(10, std::ios_base::cur); 77 state02 = is02.rdstate(); 78 pos03 = is02.tellg(); 79 VERIFY( pos03 == pos04 + off_type(10) ); 80 VERIFY( state01 == state02 ); 81 pos04 = is02.tellg(); 82 VERIFY( pos03 == pos04 ); 83 84 state01 = is03.rdstate(); 85 is03.seekg(10, std::ios_base::cur); 86 state02 = is03.rdstate(); 87 pos05 = is03.tellg(); 88 VERIFY( pos05 == pos06 + off_type(10) ); 89 VERIFY( state01 == state02 ); 90 pos06 = is03.tellg(); 91 VERIFY( pos05 == pos06 ); 92 93 // beg 94 state01 = is01.rdstate(); 95 is01.seekg(20, std::ios_base::beg); 96 state02 = is01.rdstate(); 97 pos01 = is01.tellg(); 98 VERIFY( pos01 == pos02 + off_type(10) ); 99 VERIFY( state01 == state02 ); 100 pos02 = is01.tellg(); 101 VERIFY( pos02 == pos01 ); 102 103 state01 = is02.rdstate(); 104 is02.seekg(20, std::ios_base::beg); 105 state02 = is02.rdstate(); 106 pos03 = is02.tellg(); 107 VERIFY( pos03 == pos04 + off_type(10) ); 108 VERIFY( state01 == state02 ); 109 pos04 = is02.tellg(); 110 VERIFY( pos03 == pos04 ); 111 112 state01 = is03.rdstate(); 113 is03.seekg(20, std::ios_base::beg); 114 state02 = is03.rdstate(); 115 pos05 = is03.tellg(); 116 VERIFY( pos05 == pos06 + off_type(10) ); 117 VERIFY( state01 == state02 ); 118 pos06 = is03.tellg(); 119 VERIFY( pos05 == pos06 ); 120} 121 122int main() 123{ 124 test04(); 125 return 0; 126} 127