Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > периодически возникает 13 ошибка при открытии файл


Автор: Andrej78 9.4.2008, 16:30
функция записывает в конец файла строку раз в 10 секунд и выводит на экран результат выполнения.
Периодически возникает ошибка 13 при открытии файла для записи (т.е. пишет, пишет, потом ошибка, потом опять пишет и т.д.)

ошибка 13, насколько я понял - это Permission denied (Отказ в разрешении)

в чем может быть проблема?

заодно подскажите плз,  sprintf_s может добавлять данные в конец строки (чтобы не использовать SaveSmallString)?
как обычно это делается?
Код

int SaveHistory(CSecurity *Par,CSecurity *Par1,char *FileHist)
Параметры: Par-текущие значения, Par1 - предыдущие значения, файл для записи

для упрощения (пока делаю) иногда вместо Par и Par1 использую фиксированные z и z_prev

вывод в файл в формате: 
*/
{
    FILE *stream;
    errno_t err;                //переменая с результатом открытия файла
    char str_bid_ask[500],            //строка, формируемая для лога
         tmpstr[80];
    int jj=0;                //счетчики
    if ((z.dat[0].Secunde!=z_prev.dat[0].Secunde || z.dat[0].Minute!=z_prev.dat[0].Minute) && z.dat[0].BidF!=0 && z.dat[0].BidS!=0){
        //если время предыдущей записи не совпадает с текущей и текущая запись не пустая, то...
        z_prev=z;
        if( (err  = fopen_s( &stream, FileHist, "a+" )) !=0 )
        {
            printf("error at saving history %i\n", err);
            //exit(1); 
            return 2;
        }
        else {    //если нет ошибки при записи, то пишем
            //формирую строку записи для файла
            jj=0;str_bid_ask[jj]='\0';
            jj=SaveDigitToString(Par->dat[0].Month,str_bid_ask,jj,';');
            jj=SaveDigitToString(Par->dat[0].Day,str_bid_ask,jj,';');
            jj=SaveDigitToString(Par->dat[0].Year,str_bid_ask,jj,';');
            jj=SaveDigitToString(Par->dat[0].Hour,str_bid_ask,jj,';');
            jj=SaveDigitToString(Par->dat[0].Minute,str_bid_ask,jj,';');
            jj=SaveDigitToString(Par->dat[0].Secunde,str_bid_ask,jj,';');
            jj=SaveSmallString(Par ->TickerSpot,str_bid_ask,jj,';');
            sprintf_s(tmpstr,"%g",Par->dat[0].BidS); jj=SaveSmallString(tmpstr,str_bid_ask,jj,';');
            sprintf_s(tmpstr,"%g",Par->dat[0].OfferS); jj=SaveSmallString(tmpstr,str_bid_ask,jj,';');
            jj=SaveSmallString(Par->TickerFut,str_bid_ask,jj,';');
            sprintf_s(tmpstr,"%g",Par->dat[0].BidF); jj=SaveSmallString(tmpstr,str_bid_ask,jj,';');
            sprintf_s(tmpstr,"%g",Par->dat[0].OfferF); jj=SaveSmallString(tmpstr,str_bid_ask,jj,';');
            sprintf_s(tmpstr,"%g",Par->dat[0].SpreadFaSb); jj=SaveSmallString(tmpstr,str_bid_ask,jj,';');
            sprintf_s(tmpstr,"%g",Par->dat[0].SpreadFbSa); jj=SaveSmallString(tmpstr,str_bid_ask,jj,';');
            sprintf_s(tmpstr,"%g",Par->dat[0].SpreadSaFb); jj=SaveSmallString(tmpstr,str_bid_ask,jj,';');
            sprintf_s(tmpstr,"%g",Par->dat[0].SpreadSbFa); jj=SaveSmallString(tmpstr,str_bid_ask,jj,';');
            sprintf_s(tmpstr,"%g",Par->dat[0].SKO); jj=SaveSmallString(tmpstr,str_bid_ask,jj,';');
            sprintf_s(tmpstr,"%g",(Par->dat[0].AvgSpreadFaSb+Par->dat[0].AvgSpreadFbSa)*0.5); jj=SaveSmallString(tmpstr,str_bid_ask,jj,';');
            str_bid_ask[jj++]='\n';str_bid_ask[jj++]='\0';

            fputs(str_bid_ask,stream);
            fclose(stream);
            printf("%s %i:%i \n","Saving history... ",z.dat[0].Minute,z.dat[0].Secunde);
            return 0;
        }//если нет ошибки при записи, то пишем
    }//if ((Par->dat[0].Secunde!=Par1->dat[0].Secunde || Par->dat[0].Minute!=Par1->dat[0].Minute) && Par->da......
    else {
        z_prev=z;
        return 1; //если записывать не нужно, то выход такой
    }
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)