Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

проблема fscanf Си/С++

307
06 декабря 2008 года
Artem_3A
863 / / 11.04.2008
Возникла такая проблема, при попытки чтения структуры из бинарного файла вылетает исключение
Цитата:

Unhandled exception at 0x102a403a (msvcr80d.dll) in FileContainer.exe: 0xC0000005: Access violation writing location 0xcdcdcdcd.



Данное исключение вылетает в коде

Код:
int fnCreatMassivExtract(LPFILE_INF pstMasEx, const char* pszPathStructFile, int& iCount)
{
    FILE* pStFile = NULL;
    pStFile = fopen(pszPathStructFile,"rb");
    if(!pStFile) return ERROR_OPEN;
   
    int iCountFile = 0;
    fseek(pStFile, 0, SEEK_END);
    iCountFile = ftell(pStFile)/sizeof(FILE_INF);
    pstMasEx = (LPFILE_INF)realloc(pstMasEx, sizeof(FILE_INF)*iCountFile);
    if(!pstMasEx){ fclose(pStFile); return BAD_COMPLETE;}

    iCount = iCountFile;
    rewind(pStFile);
    for(int i=0; i<iCountFile; i++)
    {
                //в этом месте
        fscanf(pStFile, "%d",pstMasEx.lShift);
        fscanf(pStFile, "%d",pstMasEx.lSize);
        fscanf(pStFile, "%s",pstMasEx.pszName);
    }
   
    fclose(pStFile);
    return GOOD_COMPLETE;
}


LPFILE_INF pstMasEx передается после
 
Код:
int iCountFile = 0;
    LPFILE_INF pstMasEx = (LPFILE_INF)malloc(sizeof(FILE_INF));
    int res = fnCreatMassivExtract(pstMasEx, pszPathStructFile, iCountFile);


Сама структура представляет собой
Код:
const int MAX_NAME_LEN_WIN32 = 256;
struct FILE_INF
{
    long lShift;
    long lSize;
    char* pszName;
   
    FILE_INF()
    {
        lShift = 0;
        lSize = 0;
        pszName = (char*)malloc(sizeof(char)*MAX_NAME_LEN_WIN32);
    }
   
    ~FILE_INF()
    {
        free(pszName);
    }
   
};
typedef FILE_INF* LPFILE_INF;


В файл при чтении которого вылетает ошибка пишется функцией
Код:
int fnFillStructFile(const char* pszPathSource, const char* pszPathStructFile,
                                                long lSizeDepot)
{
    FILE_INF stFile;
    long lLenName;
   
    if(!fnMarkName(pszPathSource)) return BAD_COMPLETE;
   
    lLenName = fnStrLen(fnMarkName(pszPathSource));
    if(lLenName==BAD_COMPLETE) return BAD_COMPLETE;

    fnCopyStr(stFile.pszName, fnMarkName(pszPathSource));
   
    FILE* pSource = NULL;
    pSource = fopen(pszPathSource, "rb");
    if(!pSource) return ERROR_OPEN;
   
    fseek(pSource, 0, SEEK_END);
    stFile.lSize = ftell(pSource);
    stFile.lShift = lSizeDepot;
    fclose(pSource);
   
    FILE* pStFile = NULL;
    pStFile = fopen(pszPathStructFile, "ab");
    if(!pStFile) return ERROR_OPEN;
   
    fprintf(pStFile,"%d%d%s",stFile.lShift,stFile.lSize,stFile.pszName);
    fclose(pStFile);
    return GOOD_COMPLETE;    
}


Помогите разобраться что не так, с функциями fprintf() и Ко работаю первый раз, так же как и с выделением памяти маллок и прочим.
у меня два соображения на счет того что может быть не так:
1. первое, возможно стоит добавить разделители в файле
 
Код:
fprintf(pStFile,"%d/n%d/n%s/n",stFile.lShift,stFile.lSize,stFile.pszName);

2. второе, что ошибка в работе с памятью...

Всем откликнувшимся буду безмерно благодарен!
38K
06 декабря 2008 года
Tooth
38 / / 07.10.2008
так и должно быть.
 
Код:
fscanf(pStFile, "%s",pstMasEx.pszName);

читаешь строку в невалидный указатель.

вобще, такую структуру в файл писать/читать не стоит.
либо размер полей в структуре сделать фиксированным,
либо перед записью содержимого строки сохранять ее размер.
опять же с выравниванием разобраться.
307
07 декабря 2008 года
Artem_3A
863 / / 11.04.2008
Цитата: Tooth
так и должно быть.
 
Код:
fscanf(pStFile, "%s",pstMasEx.pszName);

читаешь строку в невалидный указатель.

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


но в конструкторе выделяется память фиксированного размера...
и исключение вылетает при попытки чтения первого числа...
Меня не много это смущает...

307
07 декабря 2008 года
Artem_3A
863 / / 11.04.2008
Внес кое какие изменения
Код:
int fnCreatMassivExtract(LPFILE_INF pstMasEx, const char* pszPathStructFile,const int& iCountFile)
{
    FILE* pStFile = NULL;
    pStFile = fopen(pszPathStructFile,"rb");
    if(!pStFile) return ERROR_OPEN;
   
    for(int i=0; i<iCountFile; i++)
    {
        fscanf(pStFile, "%d",pstMasEx.lShift);
        fscanf(pStFile, "%d",pstMasEx.lSize);
        fscanf(pStFile, "%s",pstMasEx.szName);
    }
   
    fclose(pStFile);
    return GOOD_COMPLETE;
}


Массив создается пере передачей в функцию
 
Код:
int iCountFile = fnGetCountFile(pszPathStructFile);
    LPFILE_INF pstMasEx = new FILE_INF[iCountFile];
    int res = fnCreatMassivExtract(pstMasEx, pszPathStructFile, iCountFile);


Структуру изменил
Код:
const int MAX_NAME_LEN_WIN32 = 256;
struct FILE_INF
{
    int lShift;
    int lSize;
    char szName[256];
   
    FILE_INF()
    {
        lShift = 0;
        lSize = 0;
        szName[0]=0;
    }
    /*
    ~FILE_INF()
    {
        free(szName);
    }
    */
};
typedef FILE_INF* LPFILE_INF;


Все равно вылетает исключение, при чем при попытке чтения первого теперь уже инта!
Совершенно не могу понять в чем дело.... Кто нить может мне разъяснить где я накосячил? Буду безмерно благодарен!
307
07 декабря 2008 года
Artem_3A
863 / / 11.04.2008
Все, нашел решение, всем спасибо!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог