Mail Archives: djgpp/1998/07/12/12:04:12
On Sat, 11 Jul 1998 18:24:59 -0700, Jim Barlow
<Jim_Barlow AT bc DOT sympatico DOT ca> wrote:
> I'm trying to write a program that does this (again, C, DJGPP):
> 1) takes the first command line parameter as a filename (obvious)
> 2) opens the file. coughs up an error if any.  File is binary and can contain
> nulls in-line. Also very large (~500 kb).
Hmm, 500 KB is not very large. With DJGPP, you can read that file into
memory without problems.
> 3) reads the file into a buffer.  Search for a specific string.  If found it
> needs to be able to write to that offset.
> 4) write changes to the file without corrupting anything.  It's overwritting
> information, not inserting anything new.
> 
> FILE *fp;
> char *my_buffer, *offset;
> if (argc) {
>   fp = fopen (argv[1], "rb+"); // or whatever open for read/write binary is
>   if (ferror (fp)) {
>     printf ("There was an error...");
>     return;
>   }
That's a bad idea: if fopen() returns a NULL pointer (what it does in
case of an error), your ferror() will crash. The normal way is:
	if (!fp) {
		perror("There was an error");
		return EXIT_FAILURE;
	}
>   // best way to read the data into my_buffer?
>   my_buffer = offset = (char *)malloc (sizeof(char) *
> func_that_gets_file_size(fp));
A portable function that is suitable for files with up to 2 GB:
long func_that_gets_file_size(FILE* fp)
{
	fseek(fp,0,SEEK_END);
	return ftell(fp);
}
You could use fsetpos()/fgetpos() for larger files.
>   readinto(fp); // should i use fread() or something else?
Yes, if your file is only 500 KB, you can fread() it completely into
memory. If you have a file that is larger than your RAM, you will get a
speed penalty because of swapping, but that's not a problem here.
 
>   strchr (offset, "my_string");
strchr() is a bad idea because the string functions (str...) all stop at
the first NUL character. memchr() is suitable.
>   if (offset) {
>     strcpy (offset, "newstring");
>   }
>   // write buffer to file
Just fwrite() it out again.
> }
And don't forget to fclose() the file.
 
> Thanks for your patience.
No problem; have a look at the libc reference for the functions I
pointed out.
Regards...
		Michael
- Raw text -