Okay, I'm back again.
Now I'm trying to improve the efficiency of my file merging by merging multiple files at once. But I've again hit a snag. I suspect it is the same issue that CornedBee pointed out cropping up again, but am unsure.
Here is the relevant function which is crashing:
Code:
typedef struct inputfiles
{
char sCurrData[50];
char sFileName[80];
ifstream Data;
struct inputfiles *next;
}INPUTFILES;
typedef INPUTFILES * pInputFiles;
void Debug2 ()
{
char sData[360] = {0},
sData2[360] = {0},
sFile[80];
int iCurr,
iDup,
iLast,
x,
iFilesDone,
iOffset = 7,
iLevel = 15;
inputfiles sFileList;
inputfiles *pFileList = 0,
*pTemp = 0;
ofstream Output;
iCurr = 0;
iDup = 0;
sFileList.next = 0;
for (x = 0; (x - 1) < ( (iOffset - 1) / MERGESIZE); x++)
{
for (iLast = 0; (iLast < MERGESIZE) && (iLast + x * MERGESIZE) < iOffset; iLast++)
{
pFileList = (pInputFiles)calloc (1, sizeof (inputfiles) );
sprintf (sFile, "c:\\dev\\connect4\\connect4\\level%d_%d.txt", iLevel, (iLast + 1 + x * MERGESIZE) );
(pFileList->Data).open (sFile);
pFileList->Data >> pFileList->sCurrData;
strcpy (pFileList->sFileName, sFile);
if ( (sFileList.next == 0)
|| (strcmp (pFileList->sCurrData, sFileList.sCurrData) < 0)
)
{
pFileList->next = sFileList.next;
sFileList.next = pFileList;
}
else
{
pTemp = sFileList.next;
while ( (pTemp->next)
&& (strcmp (pFileList->sCurrData, pTemp->sCurrData) < 0)
)
{
pTemp = pTemp->next;
}
pFileList->next = pTemp->next;
pTemp->next = pFileList;
}
}
if (iLast + x * MERGESIZE < iOffset)
{
iOffset++;
sprintf (sFile, "c:\\dev\\connect4\\connect4\\level%d_%d.txt", iLevel, iOffset);
Output.open (sFile);
}
else
{
sprintf (sFile, "c:\\dev\\connect4\\connect4\\level%d.txt", iLevel);
Output.open (sFile);
}
iFilesDone = 0;
while (sFileList.next)
{
if ( (sFileList.next->next)
&& (strcmp (sFileList.next->sCurrData, sFileList.next->next->sCurrData) == 0)
)
{
iDup++;
}
else
{
Output << sFileList.next->sCurrData << '\n';
iCurr++;
}
sFileList.next->Data >> sFileList.next->sCurrData;
pTemp = sFileList.next;
if (strlen (pTemp->sCurrData) < 20)
{
sFileList.next = pTemp->next;
pTemp->Data.close();
// remove (pTemp->sFileName);
free (pTemp);
iFilesDone ++;
cout << "Completed file " << iFilesDone << " of " << iLast << ".\n";
}
else
{
pFileList = pTemp;
while ( (pTemp->next)
&& (strcmp (pFileList->sCurrData, pTemp->next->sCurrData) < 0)
)
{
pTemp = pTemp->next;
}
if (pFileList != pTemp)
{
sFileList.next = pFileList->next;
pFileList->next = pTemp->next;
pTemp->next = pFileList;
}
}
// if (iCurr % 100000 == 0)
{
cout << iCurr << " good. " << iDup << " duplicates.\n";
}
}
Output.close();
}
}
I originally was just using an array of structs to hold the file pointers. But I ran into a problem where the first pass worked fine, but every pass after failed to access the data.
The current version shown above crashes with an access violation as soon as I try to open the first file.
Am I just being stupid? Is it something simple like declaring the ifstream pointers inside the struct as pointers instead?