C ++ ifstream :: read () - искажает ли указатель ifstream get? - PullRequest
1 голос
/ 23 июня 2010

Кто-нибудь здесь знает, как указатель get в C ++ может быть поврежден после вызова read ()? Я вижу действительно странное поведение, которое я не могу объяснить. Например (иллюстративный код, а не то, что я на самом деле запускаю):

int main()
{
   // datafile.bin is a 2MB binary file...
   std::ifstream ifs( "datafile.bin", ios::binary );
   ifs.exceptions ( ifstream::eofbit | ifstream::failbit | ifstream::badbit );

   int data[100];

   std::istream::pos_type current_pos = ifs.tellg();
   // current_pos = 0, as you'd expect...

   ifs.read( reinterpret_cast<char*>(data), 100 * sizeof(int) );
   // throws no exception, so no error bits set...

   std::streamsize bytes_read = ifs.gcount();
   // gives 400, as you'd expect...

   current_pos = ifs.tellg();
   // current_pos = 0x1e1a or something similarly daft

   return 0;
}

В моем примере показано чтение массива, но это происходит даже при чтении отдельных значений встроенных типов; указатель get перед чтением корректен, вызов gcount () сообщает о правильном количестве прочитанных байтов, но после этого указатель get становится совершенно неверным. Этого не происходит с каждым вызовом read () - иногда я прохожу их до того, как один из них закончится. Что может быть обезьяной с указателем get? Я делаю что-то глубоко глупое?

Любая помощь очень ценится ...

Simon

Ответы [ 2 ]

1 голос
/ 23 июня 2010

pos_type не является целочисленным типом, а классом, я бы не стал пытаться интерпретировать его представление.Он неявно преобразуется в интегральный тип, но если вы посмотрите на него в отладчике, вы увидите внутреннее представление.

0 голосов
/ 23 июня 2010

Я пытался запустить ваш код в VS 2008 на компьютере с Vista, но не получил никакой ошибки. Я немного изменил ваш код для печати на консоли.

#include <iostream>
#include <fstream>
using namespace std;
int main()
{
   // datafile.bin is a 2MB binary file...
   std::ifstream ifs( "H_Line.bmp", ios::binary );
   ifs.exceptions ( ifstream::eofbit | ifstream::failbit | ifstream::badbit );

   int data[100];

   std::istream::pos_type current_pos = ifs.tellg();

   cout<<current_pos<<endl; // current_pos = 0, as mentioned


   ifs.read( reinterpret_cast<char*>(data), 100 * sizeof(int) );
   // throws no exception, so no error bits set...

   std::streamsize bytes_read = ifs.gcount();

   cout<<bytes_read<<endl; // gives 400, as you have mentioned

   current_pos = ifs.tellg();

   cout<<current_pos<<endl; // FOR ME IT IS GIVING 400


   return 0;
}

Я проверил это на файле образа BMP размером> 20 МБ

Не могли бы вы уточнить, какую машину / компилятор вы используете. Спасибо

...