Вот код:
#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 не перемещает указатель файла назад на один байт?
Положение указателя файла было 3 после чтение x, но сам x расположен в позиции 2 (так как самый первый символ находится в позиции 0). При возврате на 1 символ указатель файла будет помещен на символ, который он прочитал последним, что именно здесь и происходит.
Если вы хотите перейти к персонажу непосредственно перед тем, как последний прочитанный символ, вам нужно искать по -2, а не -1.
Это будет работать, если вы сделаете это: fin.seekg(-sizeof(char)-1,ios::cur);
Примечание: поиск произвольного местоположения в текстовом файле является неопределенным поведением. Посмотреть здесь: Как прочитать 6-й символ из конца файла — ifstream?