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

Вот код:

#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 не перемещает указатель файла назад на один байт?

0

Решение

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

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

3

Другие решения

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

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

2

По вопросам рекламы [email protected]