1// 2000-06-29 bkoz 2 3// Copyright (C) 2000-2015 Free Software Foundation, Inc. 4// 5// This file is part of the GNU ISO C++ Library. This library is free 6// software; you can redistribute it and/or modify it under the 7// terms of the GNU General Public License as published by the 8// Free Software Foundation; either version 3, or (at your option) 9// any later version. 10 11// This library is distributed in the hope that it will be useful, 12// but WITHOUT ANY WARRANTY; without even the implied warranty of 13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14// GNU General Public License for more details. 15 16// You should have received a copy of the GNU General Public License along 17// with this library; see the file COPYING3. If not see 18// <http://www.gnu.org/licenses/>. 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// { dg-require-fileio "" } 26 27#include <istream> 28#include <sstream> 29#include <fstream> 30#include <testsuite_hooks.h> 31 32// fstreams 33void test04(void) 34{ 35 typedef std::istream::off_type off_type; 36 37 bool test __attribute__((unused)) = true; 38 std::istream::pos_type pos01, pos02, pos03, pos04, pos05, pos06; 39 std::ios_base::iostate state01, state02; 40 const char str_lit01[] = "istream_seeks-1.txt"; 41 const char str_lit02[] = "istream_seeks-2.txt"; 42 std::ifstream if01(str_lit01, std::ios_base::in | std::ios_base::out); 43 std::ifstream if02(str_lit01, std::ios_base::in); 44 std::ifstream if03(str_lit02, std::ios_base::out | std::ios_base::trunc); 45 VERIFY( if01.good() ); 46 VERIFY( if02.good() ); 47 VERIFY( if03.good() ); 48 49 std::istream is01(if01.rdbuf()); 50 std::istream is02(if02.rdbuf()); 51 std::istream is03(if03.rdbuf()); 52 53 // pos_type tellg() 54 // in | out 55 pos01 = is01.tellg(); 56 pos02 = is01.tellg(); 57 VERIFY( pos01 == pos02 ); 58 59 // in 60 pos03 = is02.tellg(); 61 pos04 = is02.tellg(); 62 VERIFY( pos03 == pos04 ); 63 64 // out 65 pos05 = is03.tellg(); 66 pos06 = is03.tellg(); 67 VERIFY( pos05 == pos06 ); 68 69 // cur 70 // NB: see library issues list 136. It's the v-3 interp that seekg 71 // only sets the input buffer, or else istreams with buffers that 72 // have _M_mode == ios_base::out will fail to have consistency 73 // between seekg and tellg. 74 state01 = is01.rdstate(); 75 is01.seekg(10, std::ios_base::cur); 76 state02 = is01.rdstate(); 77 pos01 = is01.tellg(); 78 VERIFY( pos01 == pos02 + off_type(10) ); 79 VERIFY( state01 == state02 ); 80 pos02 = is01.tellg(); 81 VERIFY( pos02 == pos01 ); 82} 83 84int main() 85{ 86 test04(); 87 return 0; 88} 89