C ++ Я не могу использовать переменную Fstream для сохранения в файл

0

может ли кто-нибудь распознать ошибку при использовании переменной 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";
}
}
  • 0
    Вы звонили Open до Save ? Удалось ли это?
  • 0
    Есть ли причина, по которой вы не используете std::string для строк вместо указателей? (Как, например, fFileName .) То же самое с bool , почему бы не использовать его, например, как возвращение функции Open ?
Показать ещё 8 комментариев
Теги:
fstream

1 ответ

1
Лучший ответ

Я готов поспорить, что после загрузки данных вы не перезагружаете fstream.

Добавьте это в начало Save

fFile.clear();
fFile.seekp(0);
  • 1
    Учитывая использование, он, вероятно, не должен держать файл открытым все это время в любом случае. Лучшим решением было бы открыть файл (уникально для ввода) в Load и открыть его снова (на этот раз только для вывода) в Save.
  • 0
    @JamesKanze Это правда. На самом деле, как представляется, существует любое количество членов данных CardCollection , которых там быть не должно. Но изучение ООП является другой задачей.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню