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;
}
проблема fscanf Си/С++
Цитата:
Unhandled exception at 0x102a403a (msvcr80d.dll) in FileContainer.exe: 0xC0000005: Access violation writing location 0xcdcdcdcd.
Данное исключение вылетает в коде
Код:
LPFILE_INF pstMasEx передается после
Код:
int iCountFile = 0;
LPFILE_INF pstMasEx = (LPFILE_INF)malloc(sizeof(FILE_INF));
int res = fnCreatMassivExtract(pstMasEx, pszPathStructFile, iCountFile);
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;
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;
}
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. второе, что ошибка в работе с памятью...
Всем откликнувшимся буду безмерно благодарен!
Код:
fscanf(pStFile, "%s",pstMasEx.pszName);
читаешь строку в невалидный указатель.
вобще, такую структуру в файл писать/читать не стоит.
либо размер полей в структуре сделать фиксированным,
либо перед записью содержимого строки сохранять ее размер.
опять же с выравниванием разобраться.
Цитата: Tooth
так и должно быть.
читаешь строку в невалидный указатель.
вобще, такую структуру в файл писать/читать не стоит.
либо размер полей в структуре сделать фиксированным,
либо перед записью содержимого строки сохранять ее размер.
опять же с выравниванием разобраться.
Код:
fscanf(pStFile, "%s",pstMasEx.pszName);
читаешь строку в невалидный указатель.
вобще, такую структуру в файл писать/читать не стоит.
либо размер полей в структуре сделать фиксированным,
либо перед записью содержимого строки сохранять ее размер.
опять же с выравниванием разобраться.
но в конструкторе выделяется память фиксированного размера...
и исключение вылетает при попытки чтения первого числа...
Меня не много это смущает...
Код:
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;
}
{
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);
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;
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;
Все равно вылетает исключение, при чем при попытке чтения первого теперь уже инта!
Совершенно не могу понять в чем дело.... Кто нить может мне разъяснить где я накосячил? Буду безмерно благодарен!
Все, нашел решение, всем спасибо!