Article: Q43975
Product(s): See article
Version(s): 2.00
Operating System(s): MS-DOS
Keyword(s): ENDUSER | | mspl13_c
Last Modified: 2-MAY-1989
Question:
Is it possible to increase the maximum number of open files and
maximum number of streams under QuickC Version 2.00?
Response:
QuickC 2.00 does not come with start-up code; therefore, you MUST have
the Microsoft C 5.10 Optimizing Compiler to increase the maximum
number of open files and streams. CRT0DAT.ASM and _FILE.C should be
modified as described in the README.DOC included in the C 5.10
package.
Limited testing has been performed with QuickC 2.00 after altering
the start-up code in this manner; however, Microsoft cannot guarantee
that it will work properly in all cases.
After successfully assembling CRT0DAT.ASM (use the /MX switch) and
successfully compiling _FILE.C, you must do one of the following:
1. Explicitly link your program with the new CRT0DAT.OBJ and/or
_FILE.OBJ by compiling and linking on the command line using QuickC
2.00. One possible command might be as follows:
QCL TEST.C CRT0DAT /LINK /NOE
2. You can also link with the modified start-up code by creating a
program list in QuickC 2.00, which should include TEST.C,
CRT0DAT.OBJ, and/or _FILE.OBJ. Do not forget to turn the extended
dictionary flag OFF under the linker flags.
3. Replace the CRT0DAT.OBJ and/or _FILE.OBJ in the appropriate model
of the QuickC 2.00 run-time library. You can use the library
manager and the Replace command symbol (-+) in the "commands" field
to replace a module in the library.
Note: Remember that the number of low-level files must be greater than
or equal to the number of stream-level files. Therefore, if you
increase the value of _NFILE_ in _FILE.C, you must also increase the
value of _NFILE_ in CRT0DAT.ASM.
The following program will open up to 64 files, write to them, close
them, open the files again, and read from them:
#include <stdio.h>
#include <string.h>
#define MAX_FILES 64
#define MAX_BUFFER 128
#define FILE_BASE "MAX"
#define FILE_EXT ".TXT"
#define TO_WRITE "This is a bunch of text!"
void main( void )
{
FILE *streams[MAX_FILES];
char buffer[MAX_BUFFER];
int i;
int max;
int cmp;
/* Open as many files as possible. */
for( i = 0; i < MAX_FILES; i++ )
{
sprintf( buffer, FILE_BASE "%2.2d" FILE_EXT, i + 1 );
streams[i] = fopen( buffer, "w" );
if( streams[i] == NULL )
{
fprintf( stderr, "Open #%2.2d failed.\n", i + 1 );
break;
}
}
max = i;
/* Write to all open files. */
for( i = 0; i < max; i++ )
fputs( TO_WRITE, streams[i] );
/* Close all open files. */
for( i = 0; i < max; i++ )
fclose( streams[i] );
/* Open all of our files. */
for( i = 0; i < max; i++ )
{
sprintf( buffer, FILE_BASE "%2.2d" FILE_EXT, i + 1 );
streams[i] = fopen( buffer, "r" );
if( streams[i] == NULL )
fprintf( stderr, "Unable to re-open file #%2.2d\n", i + 1 );
}
/* Read from all open files. */
for( i = 0; i < max; i++ )
{
fgets( buffer, MAX_BUFFER, streams[i] );
cmp = strcmp( buffer, TO_WRITE );
if( cmp != 0 )
fprintf( stderr, "Bad data in file #%2.2d\n", i + 1 );
}
/* Close all open files. */
for( i = 0; i < max; i++ )
fclose( streams[i] );
fputs( "All done!\n", stdout );
}