delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin/1997/05/17/10:09:38

From: paul DOT toseland AT virgin DOT net (Paul Toseland)
Subject: B18&17.1 problem reading large files (more than 28k!) with read() or fread()
17 May 1997 10:09:38 -0700 :
Approved: cygnus DOT gnu-win32 AT cygnus DOT com
Distribution: cygnus
Message-ID: <337D6B74.705A.cygnus.gnu-win32@virgin.net>
Mime-Version: 1.0
X-Mailer: Mozilla 3.01 (Win95; I)
Original-To: gnu-win32 AT cygnus DOT com
Original-Sender: owner-gnu-win32 AT cygnus DOT com

I stat a file (a Net$cape FAT.DB), using its DOS filename, and it tells
me it is 692224 bytes long.  I open it, fstat it, with the same result. 
I read from it, it reads 28720 bytes and gives end of file.  The same
result happens whether I use low-level I/O or streams, or whether I use
the DOS filename or the UNIX filename.  It didn't work with b17.1
either.

Code:

#include "stdio.h"
#include "_String.h"
#include "sys\stat.h"
#include "fcntl.h"
#include "unistd.h"

void main(int argc, char **argv)
{
	if(argc < 2)
	{
		printf("Invocation: import netscape_dir\nE.G. import
c:\\netscape\\cache\n");
		return 1;	// error!
	};
	String s1(argv[1]);
	s1 = argv[1];	// netscape cache dir
	s1 += "\\FAT.DB";
	cout << s1 << "\n";
	struct stat st;
	if(stat(s1, &st))
	{
		perror(NULL);
		return 2;
	};
	printf("stat file size: %i\n", st.st_size);
	char* pChar = new char[st.st_size];
	cout << "Successfully allocated " << st.st_size << " bytes for
file.\n";
	int handle = open(s1, O_RDONLY);
	cout << "Handle: " << handle << ".\n";
	//FILE* pFile = fopen(s1, "r");
	// Get file size from handle
	fstat(handle, &st);
	printf("fstat file size: %i\n", st.st_size);
	int iRead;
	int iTotal = 0;
	char* pThisChar = pChar;
	while(iRead = read(handle, pThisChar, st.st_size))
	{
		pThisChar+=iRead;
		iTotal += iRead;
		cout << iRead << " bytes read for a total of " << iTotal << ".\n";
	};
	cout << iRead << ".\n";
	close(handle);
	cout << "File closed.\n";
/*	while(iRead = fread(pChar, 1, st.st_size, pFile))
	{
		cout << "Read " << iRead << ".\n";
	};
	cout << "EOF: " << feof(pFile) << ".\n";
	cout << "Read " << iRead << ".\n";
	cout << "EOF: " << feof(pFile) << ".\n";
	fclose(pFile);*/
};

Results:

H:\Matthew\CPP\CACHIMPT>a \c\netscape\cache
\c\netscape\cache\FAT.DB
stat file size: 692224
Successfully allocated 692224 bytes for file.
Handle: 3.
fstat file size: 692224
28720 bytes read for a total of 28720.
0.
File closed.

I have tried this for other FAT.DB's also: it returns different numbers
with the same pattern - file size several hundred k, read less than 32k,
do EOF.


-
For help on using this list (especially unsubscribing), send a message to
"gnu-win32-request AT cygnus DOT com" with one line of text: "help".

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019