Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

функция read ifstream

284
20 декабря 2006 года
michael_is_98
587 / / 25.02.2005
Здравствуйте!
Подскажите с одной неочевидной тонкостью работы функции read для экземпляра класса ifstream.
Есть структура тега ID3v1
Код:
struct ID3v1tag
{
 char sign[3];
 char Title[30];
 char Artist[30];
 char Album[30];
 char Year[4];
 char Commentaries[28];
 char nullbyte;
 char Track;
 char Genre;
};

и функция, которая читает последние 128 байт из файла (это размер структуры ID3v1tag)
Код:
// возвр. 0 в случае ошибки
int ChtenieID3v1tagIzFile(const char *fn,ID3v1tag &reftag)
{
    ifstream potok;
    int k,pos;

    potok.open(fn,ios_base::in);
    if (!potok.good()) return 0;
    potok.seekg(0,ios::end);
    pos=potok.tellg();
    pos-=sizeof(ID3v1tag);
    potok.seekg(pos,ios::beg);
    potok.read( (char*)&reftag,sizeof(ID3v1tag));
    if (potok.gcount()!=sizeof(ID3v1tag)) return 0;
    potok.close();
    potok.clear();
    return 1;
}

Так вот, на некоторых файлах (не на всех!) функция read не считывает все 128 байт, а читает только часть. Получается, что
potok.gcount()!=sizeof(ID3v1tag)
и естественно ошибка.
Размер файла заведомо большой, может быть функция read останавливает чтение на каком-либо особом символе?
9
20 декабря 2006 года
Lerkin
3.0K / / 25.03.2003
Интересный глюк. :)
В документации и у "отцов" я ничего не нашел.
Единственное, что я бы попробовал (хотя тоже самое получиться, наверное):
 
Код:
potok.open(fn,ios_base::in | ios::binary);


и еще изменить seekg\tellg на seekp\tellp.

Хотя, можно попробовать ставить позицию так:
 
Код:
potok.seekg(-sizeof(ID3v1tag), ios::end);


вместо
 
Код:
potok.seekg(0,ios::end);
pos=potok.tellg();
pos-=sizeof(ID3v1tag);
potok.seekg(pos,ios::beg);


P.S. извиняюсь, но проверить не могу.
284
20 декабря 2006 года
michael_is_98
587 / / 25.02.2005
Спасибо за советы.
ios_base::binary при открытии файла исправил ситуацию.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог