Исправление странной ошибки записи в файл в C ++ - PullRequest
2 голосов
/ 08 сентября 2010

Я получил эту действительно странную проблему, я записываю свои результаты в выходной файл, я использую функции AB и C, я активирую их в таком порядке, результаты в файле печатаются в другом порядке, сначала из A, чемиз C и после этого из B. Я просто не могу понять, почему результаты печатаются в другом порядке, чем порядок активации.спасибо.

код:

void Manager::AddCommand(Command* com, ofstream &ResultFile)
{
    if (com != NULL)
    {
        if (com->ValidCommand(ResultFile) == true)
            commands.push_back(com);
        else
                delete com;
    }
}

bool Command::ValidCommand(ofstream &Result) const
{
    if(func<PrintCityCouncilList || func >HireEmployee){
        Result << "Command:Failed activating function - invalid function number\n";
        return false;}
    if ((func == Command::PrintDepartmentEmployees) || (func == Command::PrintDepartmentExpenses) || (func == Command::PrintDepartmentStatistics)){
        if(dept<Employee::Engineering ||dept>Employee::Sanitation )
        {
            Result << "Command:Failed activating function - invalid department number\n";
            return false;
        }
    }
    return true;
}

void Manager::ActivateCommand(Command* com, ofstream &Result)
{
    if(com != NULL)
    {
        switch(com->GetFunction())
        {
            case (Command::PrintCityCouncilList): pcc->PrintCityCouncilDetails(Result);
                break;
            case (Command::PrintDepartmentEmployees):ActivatePrintDeprtEmployees(com->GetDepartment(), Result);
                break;
            case (Command::PrintEmployeeSalary):ActivateEmployeeSalary(com->GetId(), Result);
                break;
            case (Command::PrintDepartmentExpenses):ActivateDeprtExpenses(com->GetDepartment(), Result);
                break;
            case (Command::PrintCityCouncilExpenses): pcc->AllExpenses (Result);
                break;
            case (Command::PrintDepartmentStatistics):ActivateDeprtStatistics(com->GetDepartment(), Result);
                break;
            case (Command::FireEmployee): pcc->RemoveEmployeeFromCC(NULL,com->GetId(),Result);
                break;
            case (Command::HireEmployee): pcc->AddEmployeeToCC(com->GetId(),com->GetPrivateName(),com->GetSurName(),com->GetDate(),com->GetAddress(),com->GetDepartment(), com->GetStatus(),com->GetSalary(),com->GetPositionPercent(),com->GetPhoneNum(), Result);
                break;
            default:Result<<"Manager:Failed Activating command - invalid function"<<endl;
                break;
        }

    }
}

void Manager::ActivateCommandsList(ofstream &Result)
{
    Command* tmp = NULL;
    if (commands.empty() == false)
    {
        list<Command*>::iterator iter = commands.begin();
        while (iter != commands.end())
        {
            tmp = (Command*)(*iter);
            ActivateCommand(tmp,Result);
            iter++;
        }
    }
}

Ответы [ 2 ]

1 голос
/ 05 октября 2010

Хорошо, вот в чем дело, ваш код может испытывать некоторые трудности, если вы запускаете его в visual stdio.Видите ли, у него есть некоторые ошибки, когда он пытается оптимизировать ваш код.Выключите оптимизацию.Также очистите ваш поток, это делается при установке endl в cout и \ n в printf .Есть еще одна возможность, и это - повреждение стека или повреждение кучи.Проверьте, есть ли ссылки на ваши динамические объекты в пределах их границ.Пока вы не отправите код, как мой друг только что сказал, мы должны проконсультироваться с хрустальным шаром.

0 голосов
/ 08 сентября 2010

Я предполагаю, что если это домашнее задание, у вас нет проблем с потоками. Вы пытались очистить выходной поток от A, B и C? Это может решить вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...