problem with TC2.0: read()/write()

Jonathan asst-jos at yetti.UUCP
Thu Dec 21 14:36:00 AEST 1989


 Hi, I am just starting to write a program in C, and I was experimenting
with open(), close(), etc so I could read data in fixed blocks.  I am 
working with Turbo C 2.0 , and the problem is that the program sometimes
works and sometimes doesn't.  I figure every write is 64 bytes, so the file
'database' should always be a multiple of 64.  Unfortunately, this isn't 
always true, sometimes it works, and a write adds all 64 bytes, and every
once in a while it adds a few bytes for the heck of it.  I separated the 
2 programs as reader.c (read the database) and writer.c (add one entry to 
the database) for test purposes. could anyone tell me what I am doing
wrong?? or perhaps what causes TC2.0 to behave strangely.  (I have it
running on an old XT.

The telephone numbers I enter are of the for 5556666, but never longer than 
7 digits. This is meant to be a simplistic example, but the behaviour
of TC is odd. (5556666 gets translated to 71204 or thereabouts)

P.S. It seems to run well on Unix, but I haven't thrown much at it
Any and all help happily accepted, e-mail to.  I will try to reply, 
but my mail usually bounces, so I apologize in advance.

Programs follow:


------   reader.c -------
#include <stdio.h>
#include <fcntl.h>
 
#define NAMESIZE 30
 
struct telentry {
	char last[NAMESIZE];
	char first[NAMESIZE];
	long number;
};


main()
{
	int database;
	struct telentry entry;
 
	if ( (database = open("database", O_RDONLY)) == -1)
	{
		fprintf(stderr, "Unable to open database file\n");
		exit (1);
	}
 
	while ( read( database, &entry, sizeof (struct telentry)) > 0)
		fprintf(stdout, "%s, %s\t%ld\n", entry.last,
					entry.first,entry.number);
 
	if (close(database) == -1)
	{
		fprintf(stderr, "Unable to close database\n");
		exit(1);
	}
}

---- writer.c ----

#include <stdio.h>
#include <fcntl.h>

#define NAMESIZE 30
 
struct telentry {
	char last[NAMESIZE];
	char first[NAMESIZE];
	long number;
};
 
 
main()
{
	struct telentry entry;
	int database, option;
 
	if ((database=open("database",O_WRONLY | O_APPEND | O_CREAT,0666))==-1)
	{
		fprintf(stderr,"Unable to open database\n");
		exit(1);
	}
 
		printf("LAST: "); scanf(" %s", entry.last);
		printf("FIRST: "); scanf(" %s", entry.first);
		printf("NUMBER: "); scanf("%ld", &(entry.number));
		write(database, &entry, sizeof (struct telentry));
 
 
}
-------- end of programs -------
Jeffrey Klein
UUCP: Uunet!utai!utcsri!yunexus!yuyetti!asst-jos
or perhaps guest1 at alf  (...sis!alf!guest1)
(416) 783-1883



More information about the Comp.lang.c mailing list