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;
};
функция read ifstream
Подскажите с одной неочевидной тонкостью работы функции read для экземпляра класса ifstream.
Есть структура тега ID3v1
Код:
и функция, которая читает последние 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;
}
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 останавливает чтение на каком-либо особом символе?
В документации и у "отцов" я ничего не нашел.
Единственное, что я бы попробовал (хотя тоже самое получиться, наверное):
Код:
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);
pos=potok.tellg();
pos-=sizeof(ID3v1tag);
potok.seekg(pos,ios::beg);
P.S. извиняюсь, но проверить не могу.
ios_base::binary при открытии файла исправил ситуацию.