Файл функции потока


Это хорошо или нет? Входные аргументы для OsFile_Open должны быть в utf8 формате.

#include <stdio.h>

#ifdef WIN32
    #include <Windows.h>
#endif

// Types declaration, originally they are located in header file
//
typedef int                 Bool_T;
typedef signed long long    Int64_T;

#define true    1
#define false   0

#define IN
#define OUT


Bool_T OsFile_Open( IN const char * name, IN const char * mode, OUT FILE ** file )
{
    FILE * handle;    

#ifdef WIN32

    wchar_t unicodeMode[MAX_PATH];
    wchar_t unicodeName[MAX_PATH];

    int unicodeNameLen;
    int unicodeModeLen;

    unicodeNameLen = MultiByteToWideChar( CP_UTF8, 0, name, -1, unicodeName, 0 );

    if( unicodeNameLen != 0 )
    {
        if( MultiByteToWideChar( CP_UTF8, 0, name, -1, unicodeName, unicodeNameLen ) != 0 )
        {
            unicodeModeLen = MultiByteToWideChar( CP_UTF8, 0, mode, -1, unicodeMode, 0 );

            if( unicodeModeLen != 0 )
            {
                if( MultiByteToWideChar( CP_UTF8, 0, mode, -1, unicodeMode, unicodeModeLen ) != 0 )
                {
                    handle = _wfopen( unicodeName, unicodeMode );

                    if( handle != NULL )
                    {
                        *file = handle;
                        return true;

                    }else{

                        return false;
                    }

                }else{

                    return false;
                }

            }else{ // if( unicodeModeLen != 0 )

                return false;
            }

        }else{ // if( MultiByteToWideChar( CP_UTF8, 0, name, -1, unicodeName, unicodeNameLen ) != 0 )

            return false;
        }     

    }else{ // if( unicodeNameLen != 0 )

        return false;
    }

#else

    handle = fopen64( name, mode );

    if( handle != NULL )
    {
        *file = handle;
        return true;

    }else{

        return false;
    }

#endif

}


Bool_T OsFile_Close( IN FILE * file )
{
    return ( fclose( file ) == 0 ) ? true : false;
}


Bool_T OsFile_Seek( IN FILE * file, IN Int64_T offset, IN int origin )
{
    int result;

#ifdef WIN32
    result = _fseeki64( file, offset, origin );
#else
    result =  fseeko64( file, offset, origin );
#endif

    return ( result == 0 ) ? true : false;
}


Bool_T OsFile_GetPos( IN FILE * file, OUT Int64_T * curPos )
{
#ifdef WIN32
    *curPos = _ftelli64( file );
#else
    *curPos =  ftello64( file );
#endif 

    return ( *curPos != -1 ) ? true : false;
}


size_t OsFile_Read( IN FILE * file, IN int numOfBytes, OUT unsigned char * buffer )
{
    return fread( buffer, sizeof( unsigned char ), numOfBytes, file );
}


int OsFile_Eof( IN FILE * file )
{
    return feof( file );
}


332
4
задан 6 июля 2011 в 12:07 Источник Поделиться
Комментарии
2 ответа

Я бы ре-структуры (в Win32 часть) открытое функция что-то вроде этого:

#ifdef WIN32

wchar_t unicodeMode[MAX_PATH];
wchar_t unicodeName[MAX_PATH];

if (MultiByteToWideChar( CP_UTF8, 0, name, -1, unicodeName, MAX_PATH) &&
MultiByteToWideChar( CP_UTF8, 0, mode, -1, unicodeMode, MAX_PATH) &&
(handle = _wfopen( unicodeName, unicodeMode)) != NULL)
{
*file = handle;
return true;
}
return false;

#else

Вы не должны назвать не менее multibytetowidechar дважды для каждого преобразования -- первый вызов возвращает не только длина, но не преобразования, а также. Как он стоит, ваш код имеет потенциальные переполнения буфера, а также-это первый звонок для multibytetowidechar, чтобы измерить длину, которая потребуется для результата, но не проверили, что этот был меньше или равен буферного пространства Вам обеспечена.

Он может быть законным, чтобы сделать два последовательных вызовов, особенно если (например) вы хотите, чтобы убедиться, что вы можете справиться с любой возможной входной сигнал с помощью первого звонка меру необходимой длины, затем выделить необходимое пространство динамически, а потом делает второй вызов с помощью динамически выделенную память.

Нескольких местах, у вас есть такие вещи, как:

return ( fclose( file ) == 0 ) ? true : false;

Они должны быть написаны как:

return fclose(file) == 0;

или просто:

return !fclose(file);

Там нет необходимости, чтобы выбрать и вернуть логический литерал -- булевы значения, полученные на == и ! будет хорошо работать как есть.

Редактировать: вы также имеете пару вещей, таких как:

#ifdef WIN32
*curPos = _ftelli64( file );
#else
*curPos = ftello64( file );
#endif

распространение по всему коду. Где вы просто общаетесь с разными названиями функции, как это, я думаю, что я бы один блок вверх-стойка в интернет с именем различия, а затем использовать одно имя за счет остальной код:

#ifdef WIN32
#define ftello64(x) _ftelli64(x)
#define fseeko64(x) _fseeki64(x)
#endif

/* ... */

Bool_T OsFile_Seek( IN FILE * file, IN Int64_T offset, IN int origin )
{
return !fseeko64(file, offset, origin);
}

Возможно, вы захотите прочитать директиву#ifdef, которые считаются вредными для больше о том, что делать и чего избегать.

5
ответ дан 6 июля 2011 в 03:07 Источник Поделиться

Рассмотреть вопрос о замене структуры кода такой:

if (predicate)
{
// many lines of code here
if (predicate2)
{
// even more lines of code here
}
else
{
return false;
}
}
else
{
return false;
}

гораздо проще:

if (!predicate)
return false;

// long code here

if (!predicate2)
return false

// second long paragraph

4
ответ дан 6 июля 2011 в 07:07 Источник Поделиться