Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> File descriptor, Помогите разобраться 
:(
    Опции темы
jimbo
  Дата 18.6.2009, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 18.6.2009
Где: Южно-Сахалинск

Репутация: нет
Всего: нет



Есть много файлов которые надо переконвертировать из одного формата в дргуой. делаю вот такую функцию пробежки по каталогу:

Код

HANDLE hFind = INVALID_HANDLE_VALUE;
    char string[MAX_PATH];
    WIN32_FIND_DATA winData;
    DWORD dwError;
    strcpy(string,".\\*");
    hFind = FindFirstFile(string, &winData);
    if (hFind != INVALID_HANDLE_VALUE) 
    {
        while (FindNextFile(hFind, &winData) != 0) 
        {
            if( !strcmp("..",winData.cFileName)) continue;
            if(winData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY) continue;
            else
            {
                if(winData.cFileName[strlen(winData.cFileName)-3]=='f' && winData.cFileName[strlen(winData.cFileName)-2]=='x' && winData.cFileName[strlen(winData.cFileName)-1]=='h')
                if(fxh2csv(winData.cFileName))
                {
                    printf("error open file\n");
                }
                else
                {
                    printf("conversation %s complite\n",winData.cFileName);
                }
            }
        }
        dwError = GetLastError();
        if (dwError != ERROR_NO_MORE_FILES) 
        {
            printf ("FindNextFile error. Error is %u\n", dwError);
        }
    }
    FindClose(hFind);
    printf("All files were converted sucessfully\nenter to exit\n");
    getchar();
    return;


функция fxh2csv - делает конвертацию. Открывает один файл на чтение, другой на запись используя функции _open(). Эта функция возвращает дескриптор файла. проблема в том, что после конвертации 2048 файлов, дальше программа не открывает ни один файл. пишет ошибку 24 - EMFILE
 Too many open files
 

код функции конвертации
Код

int fd;
    char* fname = NULL;
    fname = StringSubstr(filenamefxh,0,strlen(filenamefxh)-4);
    //char* data;
    char* filenamecsv = NULL;
    filenamecsv = new char[strlen(fname)+5];
    strcpy(filenamecsv,fname);
    strcat(filenamecsv,".csv");
    filenamecsv[strlen(filenamecsv)]=0;
    //printf("%s\n%s\n",filenamecsv,filenamehst);
    
    if( -1==(fd = _open(filenamefxh,_O_RDONLY | _O_BINARY )) )
    {
        //if(-1==(fd = _open(filenamehst,_O_CREAT | _O_BINARY | _O_WRONLY )))
        {
            printf("cant open %s\n",filenamefxh);
            if(fname)
            {
                delete []fname;
                fname = NULL;
            }
            if(filenamecsv)
            {
                delete []filenamecsv;
                filenamecsv = NULL;
            }
//            printf("%d\ncant open file %s\n",fd,filenamehst);
            return 1;        //не открылся файл hst
        }
    }
    int period,digits;
    char symbol[12];
    //printf("loading header\n");
    loadFXHHeader(fd,symbol,period,digits);
    //printf("%s %d %d",symbol,period,digits);
    int open,hi,low,close;
    double d_open,d_hi,d_low,d_close;
    double vol;
    unsigned int time;
    int err=0;
    //int err = loadHSTQuote(fd,time,open,hi,low,close,vol);
    int fd2;
    //errno_t err;
    if( -1==(fd2 = _open(filenamecsv,  _O_BINARY | _O_CREAT , _S_IREAD | _S_IWRITE)) )
    {
        _get_errno( &err );
        printf( "errno = %d\n", err );
        printf("cant open %s\n",filenamecsv);
        if(fd2 == EMFILE) printf("No more file descriptors available (too many open files)\n");
        if(fd) _close(fd);
        if(fname)
        {
            delete []fname;
            fname = NULL;
        }
        if(filenamecsv)
        {
            delete []filenamecsv;
            filenamecsv = NULL;
        }
        return 1;
    }
    if(-1==(fd2 = _open(filenamecsv, _O_BINARY | _O_WRONLY | _O_TRUNC )))
    {
        //printf("%d\ncant open file %s\n",fd,filenamehst);
        printf("cant open %s\n",filenamecsv);
        if(fd) _close(fd);
        if(fname)
        {
            delete []fname;
            fname = NULL;
        }
        if(filenamecsv)
        {
            delete []filenamecsv;
            filenamecsv = NULL;
        }
        return 1;        //не открылся файл hst
    }
    //fd2 = _open(filenamecsv, _O_WRONLY | _O_TRUNC | _O_TEXT);
    /*FILE* stream;
    errno_t error;
    error = fopen_s(&stream,filenamecsv,"w");
    if(error!=0) return 1;*/
    //if(error = fopen_s(&stream,filenamecsv,"w")) return 1;
    //printf("loading quote\n");
    //if(fd2>0) fd2 = 5;
    while(true )
    {
        
        err = loadFXHQuote(fd,time,open,hi,low,close,vol);
        if(time==0) break;
        if(err == 0)
        {
            char* data = Unparse(time);
            /*printf("%s ",data);
            printf("%.5f ",open);
            printf("%.5f ",hi);
            printf("%.5f ",low);
            printf("%.5f ",close);
            printf("%.0f\n",vol);*/
            char buf[1000];
            for(int i=0;i<1000;i++)
                buf[i]=0;
            hi = open+hi;
            low = open+low;
            close = open+close;
            d_open = open;
            d_hi = hi;
            d_low = low;
            d_close = close;
            d_open =d_open/pow(10,(double)digits);
            d_hi =d_hi/pow(10,(double)digits);
            d_low =d_low/pow(10,(double)digits);
            d_close =d_close/pow(10,(double)digits);

            sprintf(buf,",%.5f,%.5f,%.5f,%.5f,%.0f\r\n",d_open,d_hi,d_low,d_close,vol);
            _write(fd2,data,16);
            _write(fd2,buf,strlen(buf));
            /*_write(fd2,&open,8);
            _write(fd2,&hi,8);
            _write(fd2,&low,8);
            _write(fd2,&close,8);
            _write(fd2,&vol,8);*/
            /*fprintf(stream,"%s",data);
            fprintf(stream,"%c",',');
            fprintf(stream,"%.5f",open);
            fprintf(stream,"%c",',');
            fprintf(stream,"%.5f",hi);
            fprintf(stream,"%c",',');
            fprintf(stream,"%.5f",low);
            fprintf(stream,"%c",',');
            fprintf(stream,"%.5f",close);
            fprintf(stream,"%c",',');
            fprintf(stream,"%.0f",vol);
            fprintf(stream,"%s","\r\n");*/
            vol=close=open=hi=low=0.0;
            time=0;
            if(data) 
            {
                delete []data;
                data = NULL;
            }
        }
        else
        {
//            printf("%d\n",err);
            break;
        }
    }
    //printf("end loading quotes\ndeleting handlers\n");
    if(fname)
    {
        delete []fname;
        fname = NULL;
    }
    //printf("delete fname\n");
    if(filenamecsv)
    {
        delete []filenamecsv;
        filenamecsv = NULL;
    }
    //printf("delete filenamecsv\n");
    //if(stream) fclose(stream);
    printf("fd = %d fd2= %d\n",fd,fd2);
    _close(fd);
    //printf("delete fd\n");
    _close(fd2);
    _get_errno( &err );
    printf( "errno = %d\n", err );
    printf("fd = %d fd2= %d\n",fd,fd2);
    //printf("delete fd2\n");
    return 0;


Добавлено через 1 минуту и 32 секунды
Почему максимум 2048 файлов и где подправить чтобы это константа стала намного больше?
--------------------
Я не играю в шахматы - в шахматах я борюсь. А.А.Алехин
PM MAIL WWW   Вверх
fry
Дата 18.6.2009, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 4.10.2006

Репутация: нет
Всего: 3



Код

if( -1==(fd2 = _open(filenamecsv,  _O_BINARY | _O_CREAT , _S_IREAD | _S_IWRITE)) )
    {
        _get_errno( &err );
        printf( "errno = %d\n", err );
        printf("cant open %s\n",filenamecsv);
        if(fd2 == EMFILE) printf("No more file descriptors available (too many open files)\n");
        if(fd) _close(fd);
        if(fname)
        {
            delete []fname;
            fname = NULL;
        }
        if(filenamecsv)
        {
            delete []filenamecsv;
            filenamecsv = NULL;
        }
        return 1;
    }

    if(-1==(fd2 = _open(filenamecsv, _O_BINARY | _O_WRONLY | _O_TRUNC )))
    {
        //printf("%d\ncant open file %s\n",fd,filenamehst);
        printf("cant open %s\n",filenamecsv);
        if(fd) _close(fd);
        if(fname)
        {
            delete []fname;
            fname = NULL;
        }
        if(filenamecsv)
        {
            delete []filenamecsv;
            filenamecsv = NULL;
        }
        return 1;        //не открылся файл hst
    }


Цитата

Код

if( -1==(fd2 = _open(filenamecsv,  _O_BINARY | _O_CREAT , _S_IREAD | _S_IWRITE)) )


допустим, что
fd2 == реальному файловому дескриптору

Цитата

Код

if(-1==(fd2 = _open(filenamecsv, _O_BINARY | _O_WRONLY | _O_TRUNC )))


допустим, что
fd2 == реальному файловому дескриптору, но уже другому.

Вопрос: первое значение дескриптора где?
Ответ: нигде.

+1 к незакрытым дескрипторам smile 

Цитата

Почему максимум 2048 файлов и где подправить чтобы это константа стала намного больше?


Чем "лечить" последствия надо подумать причину возникновения проблемы. В проге, как я понимаю, должно быть открыто только 2 файла одновременно. Спрашивается, зачем надо делать максимальное значение открытых файлов еще больше при условии, что прога заведомо неправильно работает?

Добавлено через 4 минуты и 16 секунд
Функция обработки явно сильно перегружена. Для избежания ошибок ее хорошо бы разделить на несколько частей, занимающихся выполнением конкретной функции, а не всех сразу. Меньше будет ошибок. Также хорошо если будет выполняться последовательность выделил "переменную - попользовался - забыл о ней", т.е. надо стремиться к минимуму глобальных переменных (как в смысле глобальных, так и в смысле переменных, используемых на протяжении многих строк кода).
PM MAIL   Вверх
jimbo
Дата 18.6.2009, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 18.6.2009
Где: Южно-Сахалинск

Репутация: нет
Всего: нет



отбой.. решение - не использовать _open
--------------------
Я не играю в шахматы - в шахматах я борюсь. А.А.Алехин
PM MAIL WWW   Вверх
fry
Дата 18.6.2009, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 4.10.2006

Репутация: нет
Всего: 3



Цитата

отбой.. решение - не использовать _open


Правильно.... Н.х все windows'ы и MSDN'ы. (ШУЧУ КОНЕЧНО!)   smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0457 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.