Увеличение объекта streampos - PullRequest
5 голосов
/ 31 марта 2011

Я пытаюсь сделать что-то вроде этого:

for (std::streampos Position = 0; Position < 123; Position++)
{
    // Use Position to access something...
}

Однако, похоже, что std::streampos не перегружен operator++.

Пытаюсь использовать Position = (Position + 1)приводит к следующей ошибке:

ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second:

Есть ли обходной путь для этого, или я должен полагаться на то, что long unsigned int достаточно большой для файлов?

Ответы [ 4 ]

5 голосов
/ 31 марта 2011

Попробуйте std::streamoff, который представляет смещение в потоке. Он поддерживает операторы до и после увеличения / уменьшения.

Базовый тип определяется реализацией, но должен иметь возможность последовательно преобразовываться как в streamsize, так и в fpos (, таким образом, в streampos * )

Изменить на комментарий Maxpm: Вы можете применить streamoff к любому месту, будь то ios::beg или произвольное streampos. Примените его к ios::beg, и он будет вести себя как обычный streampos. Примените его к streampos, и вы получите streampos+streamoff.

4 голосов
/ 31 марта 2011

Использование +=:

for (std::streampos Position = 0; Position < 123; Position += 1)

+ не работает, потому что operator + фактически определено для streampos и steamoff, а не int.

Это означает, что существуют два неявных преобразования, которые одинаково хороши: либо ваш 1 может быть преобразован в streamoff (что, вероятно, является typedef для unsigned long). Или streampos неявно преобразуется в streamoff, к которому затем добавляется 1.

3 голосов
/ 31 марта 2011

std::streampos не является числовым типом, хотя он поддерживает преобразование в числовые типы и обратно.Если вы хотите сделать арифметику по позиции, вам нужно использовать std::streamoff (и указывать аргумент from при вызове seek).

Также не забывайте, что вы не можете искать произвольную позициюв файле, если он не был открыт в двоичном режиме и пропитан языком «C».

0 голосов
/ 20 декабря 2018

Я наткнулся на эту ссылку, изучая, как я могу вычесть из std::streampos объекта: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=187599

Предлагаемое решение - использовать определенную перегрузку оператора operator+() или operator-(), которая работает довольнохорошо для меня.

Position.operator+(increment_val); 
Position.operator-(decrement_val); // alternative

PS Может быть лучше использовать operator+(), чем operator-(), чтобы избежать каких-либо проблем, связанных со сменой знака

...