Iobuffer.cpp
#include "Iobuffer.h"
IOBuffer::IOBuffer (int maxBytes){
Init (maxBytes);
}
IOBuffer & IOBuffer :: operator = (const IOBuffer & buffer){
if(MaxBytes< buffer.BufferSize) return *this;//fail
Initialized = buffer.Initialized;
BufferSize = buffer.BufferSize;
memcpy(Buffer, buffer.Buffer, buffer.BufferSize);
NextByte = buffer.NextByte;
Packing = Packing;
return *this;
}
void IOBuffer::Clear(){
NextByte = 0;
Packing = true;
}
void IOBuffer::Print(ostream & stream) const{
stream<<"MaxBytes "<<MaxBytes<<" BufferSize "<<BufferSize;
}
int IOBuffer::Init (int maxBytes){
Initialized = false;
if (maxBytes < 0) maxBytes = 0;
MaxBytes = maxBytes;
Buffer = new char[MaxBytes];
BufferSize = 0;
Clear ();
return 1;
}
int IOBuffer::DRead(istream & stream, int recref){
stream.seekp(recref, ios::beg);
if(stream.tellp() != recref) return -1;
return Write(stream);
}
static const char * headerStr = "IOBuffer";
static const int headerSize = strlen(headerStr);
int IOBuffer::ReadHeader(istream & stream){
char str[9];
stream.seekg(0, ios::beg);
stream.read(str, headerSize);
if(!stream.good()) return -1;
if(strncmp(str,headerStr, headerSize)==0) return headerSize;
else return -1;
}
int IOBuffer::WriteHeader (ostream & stream) const{
stream.seekp(0, ios::beg);
stream.write(headerStr, headerSize);
if(!stream.good()) return -1;
return headerSize;
}
это сопровождается Iobuffer.h
#include <cstring>
#include <iostream>
class IOBuffer{
public:
IOBuffer (int maxBytes = 1000);
IOBuffer & operator = (const IOBuffer &);
virtual void Clear ();
virtual int Pack (const void * field, int size = -1) = 0;
virtual int Unpack (void * field, int maxbytes = -1) = 0;
virtual void Print(ostream &) const;
int Init (int maxBytes);
virtual int Read (istream & x) = 0;
virtual int Write (ostream & x) const = 0;
virtual int DRead(istream &, int recref);
virtual int DWrite(ostream &, int recref) const;
virtual int ReadHeader (istream &);
virtual int WriteHeader (ostream *);
protected:
int Initialized;
char * Buffer;
int BufferSize;
int MaxBytes;
int NextByte;
int Packing;
};
Это задание из моего курса по файловым системам. В Iobuffer.h, #include <iostream>
есть, потому что я предполагал, что это исправит "ostream" или "istream" "не было объявлено" ошибки, которые я получаю от виртуальной; Прототипы функций Печать, Чтение, Запись, DRead, DWrite, ReadHeader и WriteHeader. Это единственные ошибки из этого файла. Ошибки в файле .cpp несколько коррелируют, я получаю те же ошибки «istream» и «ostream не был объявлен». Любая помощь очень ценится, дайте мне знать, если потребуется дополнительная информация.
-Macaire
Обновление, предложение сэра Чарльзворта сокращает ошибки в геометрической прогрессии. В заголовочном файле для прототипа виртуальной функции WriteHeader генерируется ошибка «Кандидат: виртуальный int IOBuffer :: WriteHeader (std :: ostream )».
Остальные 5 ошибок находятся в файле .cpp, три из них из определения DRead (по одной в каждой строке). Первая строка гласит
‘struct std::basic_istream<char, std::char_traits<char> >’ has no member named ‘seekp’
С другой стороны, почему это форматирование такое иностранное? Я посмотрел ostream
здесь на cplusplus.com, и я полагаю, что это может быть потому, что я использую целое число в качестве смещения поиска. Продолжая, следующая строка говорит
‘struct std::basic_istream<char, std::char_traits<char> >’ has no member named ‘tellp’
В ответном выражении говорится что-то очень любопытное,
no matching function for call to ‘IOBuffer::Write(std::basic_istream<char, std::char_traits<char> >&)’
Последняя ошибка - прототип для
‘int IOBuffer::WriteHeader(std::ostream&) const’ does not match any in class ‘IOBuffer’
и да, это было 5, а не 6 ошибок.