может ли кто-нибудь распознать ошибку при использовании переменной fstream fFile здесь? потому что при функции Save() запись в процесс диска (по функции WriteTo()) всегда терпит неудачу. Но если я объявлю новую локальную переменную fstream вместо fFile, сохраните ее в порядке. (см. часть приведенного ниже кода)
Спасибо
class CardCollection{
public:
CardCollection();
int Open(const char filename[]);
void Close();
void Close();
int NumCards()const;
void ReportStatus()const;
void AddCards();
void DeleteCard(int cardnum);
void ShowCard(int cardnum)const;
void ChangeCard(int cardnum);
void DoFind();
void DoFindAgain();
void DoView();
private:
int GetField(int anyallowed);
void Load();
int fNumCards;
char *fFileName;
std::fstream fFile;
DynamicArray fStore;
char *fFindString;
int fFindPos;
int fSearchField;
};
int CardCollection::Open(const char filename[])
{
//Keep copy of filename
fFileName = new char[strlen(filename)+1];
strcpy(fFileName, filename);
fFile.open(fFileName, std::ios::out | std::ios::in);
if(!fFile.good())
return -1;
Load();
return 0;
}
void CardCollection::Save()
{
for(int i = fNumCards ; i > 0; i--){
RefCard *r = (RefCard*) fStore.Nth(i);
r->WriteTo(fFile); // If I declare a new fstream here
// instead of using fFile, save is ok
}
if(fFile.good()){
std::cout << "Saving completed";
}
else{
std::cout << "Saving error";
}
}
Я готов поспорить, что после загрузки данных вы не перезагружаете fstream
.
Добавьте это в начало Save
fFile.clear();
fFile.seekp(0);
CardCollection
, которых там быть не должно. Но изучение ООП является другой задачей.
Open
доSave
? Удалось ли это?std::string
для строк вместо указателей? (Как, например,fFileName
.) То же самое сbool
, почему бы не использовать его, например, как возвращение функцииOpen
?