Почему функция поиска не работает?

Вот код:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main(int argc, char *argv[])
{
  string infile(argv[1]);
  ifstream fin(infile.data());

  string var_name;
  char ch = fin.get();
  cout << ch << endl;

  ch = fin.get();
  cout << ch << endl;

  ch = fin.get();
  cout << ch << endl;

  cout << "pos: " << fin.tellg() << endl;
  fin.seekg(-sizeof(char),ios::cur);
  cout << "pos: " << fin.tellg() << endl;

  ch = fin.get();
  cout << ch << endl;

  return 0;
}

содержимое файла представляет собой просто строку:

<
?
x
m

и вывод:

<\n
?\n
x\n
pos: 3\n
pos: 2
x

Почему последний напечатанный символ все еще «x» ?? Почему функция seekg не перемещает указатель файла назад на один байт?


person eaglesky    schedule 07.02.2013    source источник


Ответы (2)


Позиция указателя файла была 3 после чтения x, но сам x расположен в позиции 2 (поскольку самый первый символ находится в позиции 0). При перемещении назад на 1 символ указатель файла будет установлен на последний прочитанный символ, что именно здесь и происходит.

Если вы хотите перейти к символу непосредственно перед последним прочитанным символом, вам нужно искать -2, а не -1.

person Michael Madsen    schedule 07.02.2013

Это сработает, если вы сделаете это: fin.seekg(-sizeof(char)-1,ios::cur);

Примечание: поиск произвольного места в текстовом файле является неопределённым поведением. См. здесь: Как читать 6-й символ с конца файла - ifstream?

person Aniket Inge    schedule 07.02.2013
comment
sizeof(char) всегда равно 1. С таким же успехом можно было бы просто написать -2. - person Alex; 07.02.2013
comment
Это было для полноты :-P @Alex. ОП поймет, если я напишу это так, потому что он пытался написать это как -sizeof(char). - person Aniket Inge; 07.02.2013
comment
Тогда должно быть -sizeof(char)*2 :) - person Alex; 07.02.2013