From: Martin Weber Date: 2003-10-31T03:22:45+09:00 Subject: Re: Problem with seeking in existing files. On Fri, Oct 31, 2003 at 02:57:13AM +0900, agemoagemo@yahoo.com wrote: > > --- Warren Brown wrote: > > Morgan, > > > > > I'm trying to write a program that will be writing > > > data to an existing file, that will not > > necessarily > > > be done in the physical file order. I used mode > > > 'ab+' to open the file, as only the 'a' modes > > allow > > > writing without changing the existing file. > > > > It sounds like what you really want is to open > > the file with a mode > > of 'r+b'. This allows reading and writing of the > > file without > > truncating the file (like 'w+b'). As you mentioned, > > a mode of 'ab' > > opens the file for writing only (at end of file). > > To open for reading > > and writing (at end of file) you would need a mode > > of 'a+b'. I believe > > a mode of 'ab+' is technically incorrect on most > > platforms, although it > > may work on some. > > Well, I don't know about technical incorrectness, but > mode 'a+b' is identified as an illegal access mode, > wheras 'ab+' will execute. > > Using mode 'rb+' seems to produce the behavior I > need... when the file exists. When it doesn't, > however, it produces: > ... File.new/open(filename, File::CREAT|File::RDWR) ... File::CREAT means, create the file if it doesn't exist. "a" is equivalent to File::CREAT|File::WRONLY + seek(0, IO::SEEK_END) w is File::CREAT|File::WRONLY|File::TRUNC r is File::RDONLY r+ is File::RDWR See, File::CREAT is lacking here. With it there would be no error. w+ is File::TRUNC|File::CREAT|File::RDWR b means binary on windows, but on unix that's a noop, as there is no artificial distinction between file types. Content is what counts, so I can't tell you what's the File:: equivalent to it. Just don't use the strings, use the File:: constants. -Martin