write to specific line in file?

G

globalrev

i ahve a program that takes certain textsnippets out of one file and
inserts them into another.

problem is it jsut overwrites the first riow every time.

i want to insert every new piece of text into the next row.
so:
1. how do i write to a new line every time i write to the file?

2. if i dont want to write to a new line but just want to insert it
after the last token in the file, how do i do then?
 
7

7stud

globalrev said:
i ahve a program that takes certain textsnippets out of one file and
inserts them into another.

problem is it jsut overwrites the first riow every time.

i want to insert every new piece of text into the next row.
so:
1. how do i write to a new line every time i write to the file?

2. if i dont want to write to a new line but just want to insert it
after the last token in the file, how do i do then?

Generally, you can't "insert" anything into a file. You can either
append to the end of a file, or you can rewrite the whole file. It
sounds like you probably want to read the file into an array using
readlines(). Then manipulate that array however you want--appending
and inserting--and when you are done, overwrite the file with your
array.

However, you should be aware that as soon as you open a file for
writing all the data is erased, and if your program should happen to
crash right then, the array containing the data will disappear into
the ether and your file will be empty--in other words all your data
will be gone. To prevent such an occurence, you should write your
final data to another file, then delete the original file, and finally
change the other file's name to the original file name.
 
C

castironpi

Generally, you can't "insert" anything into a file.  You can either
append to the end of a file, or you can rewrite the whole file.  It
sounds like you probably want to read the file into an array using
readlines().  Then manipulate that array however you want--appending
and inserting--and when you are done, overwrite the file with your
array.

However, you should be aware that as soon as you open a file for
writing all the data is erased, and if your program should happen to
crash right then, the array containing the data will disappear into
the ether and your file will be empty--in other words all your data
will be gone.  To prevent such an occurence, you should write your
final data to another file, then delete the original file, and finally
change the other file's name to the original file name.

Some options:

1. Limit line length. Then offset is ( line* length ).
2. Name your relation.
3. Hijack the operating system. Remember:

abc
def

on disk looks like
abc\ndef

where

abcd
def

looks like
abcd\ndef

So, if you want line 2, you have to scan line 1.
 
C

castironpi

Some options:

1.  Limit line length.  Then offset is ( line* length ).
2.  Name your relation.
3.  Hijack the operating system.  Remember:

abc
def

on disk looks like
abc\ndef

where

abcd
def

looks like
abcd\ndef

So, if you want line 2, you have to scan line 1.- Hide quoted text -

- Show quoted text -

You also have

f.seek( X )
f.write( 'abc' )

which writes 'abc' in the middle, at offset X.

f.seek( 0, SEEK_END )

takes you to the back, and don't forget

f.flush( ).

Say you have:

File:

abc
def
ghi

Symbols:

0-3
1-3
2-3

abcdefghi

and you want to make abc abC. Then

f.seek( 2 )
f.write( 'C' )

does work.

If you want to make abc ab, then you change a different file

table.seek( 0 )
table.write( chr( 2 ) )

( or bytes( [ 2 ] ) in 3.0 ).

If you want to make abc abcd, then you change both.

f.seek( 9 )
f.write( 'd' )

table.seek( 0 )
table.write( chr( 4 ) )

But. Now you have item 0 in two places. 'abc' somewhere and 'd'
somewhere else, at 0 and at 9 respectively. I think the file system
overallocates room for String 1. You would read:

0- 2- [ 3, 1 ]

for 'abc'+'d'

and

1- 1- [ 3 ]
2- 1- [ 3 ]

for 'def' and 'ghi', where actual representations would be:

0- 2- [ 0/3, 9/1, 0, 0, 0, 0, 0, 0 ]
1- 1- [ 3/3, 0, 0, 0, 0, 0, 0, 0 ]
2- 1- [ 6/3, 0, 0, 0, 0, 0, 0, 0 ]

As your chains start to grow, leave table 8xN, and just copy strings
to new sectors when they become long:

0- 1- [ 9/4, 0, 0, 0, 0, 0, 0, 0 ]
1- 1- [ 3/3, 0, 0, 0, 0, 0, 0, 0 ]
2- 1- [ 6/3, 0, 0, 0, 0, 0, 0, 0 ]

You can insort in linear time when you're looking for available slots.

'jklm' can't fit at 0.

0- 1- [ 9/4, 0, 0, 0, 0, 0, 0, 0 ]
1- 1- [ 3/3, 0, 0, 0, 0, 0, 0, 0 ]
2- 1- [ 6/3, 0, 0, 0, 0, 0, 0, 0 ]
3- 1- [ 13/4, 0, 0, 0, 0, 0, 0, 0 ]

but 'nop' can.

0- 1- [ 9/4, 0, 0, 0, 0, 0, 0, 0 ]
1- 1- [ 3/3, 0, 0, 0, 0, 0, 0, 0 ]
2- 1- [ 6/3, 0, 0, 0, 0, 0, 0, 0 ]
3- 1- [ 13/4, 0, 0, 0, 0, 0, 0, 0 ]
4- 1- [ 0/3, 0, 0, 0, 0, 0, 0, 0 ]

'jklm' could've with a split:

0- 1- [ 9/4, 0, 0, 0, 0, 0, 0, 0 ]
1- 1- [ 3/3, 0, 0, 0, 0, 0, 0, 0 ]
2- 1- [ 6/3, 0, 0, 0, 0, 0, 0, 0 ]
3- 2- [ 0/3, 13/1, 0, 0, 0, 0, 0, 0 ]

and with 'nop':

0- 1- [ 9/4, 0, 0, 0, 0, 0, 0, 0 ]
1- 1- [ 3/3, 0, 0, 0, 0, 0, 0, 0 ]
2- 1- [ 6/3, 0, 0, 0, 0, 0, 0, 0 ]
3- 2- [ 0/3, 13/1, 0, 0, 0, 0, 0, 0 ]
4- 1- [ 14/3, 0, 0, 0, 0, 0, 0, 0 ]

There's an easy chance you can beat DbfilenameShelf for your
application.
 
C

castironpi

Some options:
1.  Limit line length.  Then offset is ( line* length ).
2.  Name your relation.
3.  Hijack the operating system.  Remember:

on disk looks like
abc\ndef


looks like
abcd\ndef
So, if you want line 2, you have to scan line 1.- Hide quoted text -
- Show quoted text -

You also have

f.seek( X )
f.write( 'abc' )

which writes 'abc' in the middle, at offset X.

f.seek( 0, SEEK_END )

takes you to the back, and don't forget

f.flush( ).

Say you have:

File:

abc
def
ghi

Symbols:

0-3
1-3
2-3

abcdefghi

and you want to make abc abC.  Then

f.seek( 2 )
f.write( 'C' )

does work.

If you want to make abc ab, then you change a different file

table.seek( 0 )
table.write( chr( 2 ) )

( or bytes( [ 2 ] ) in 3.0 ).

If you want to make abc abcd, then you change both.

f.seek( 9 )
f.write( 'd' )

table.seek( 0 )
table.write( chr( 4 ) )

But.  Now you have item 0 in two places.  'abc' somewhere and 'd'
somewhere else, at 0 and at 9 respectively.  I think the file system
overallocates room for String 1.  You would read:

0- 2- [ 3, 1 ]

for 'abc'+'d'

and

1- 1- [ 3 ]
2- 1- [ 3 ]

for 'def' and 'ghi', where actual representations would be:

0- 2- [ 0/3, 9/1, 0, 0, 0, 0, 0, 0 ]
1- 1- [ 3/3, 0, 0, 0, 0, 0, 0, 0 ]
2- 1- [ 6/3, 0, 0, 0, 0, 0, 0, 0 ]

As your chains start to grow, leave table 8xN, and just copy strings
to new sectors when they become long:

0- 1- [ 9/4, 0, 0, 0, 0, 0, 0, 0 ]
1- 1- [ 3/3, 0, 0, 0, 0, 0, 0, 0 ]
2- 1- [ 6/3, 0, 0, 0, 0, 0, 0, 0 ]

You can insort in linear time when you're looking for available slots.

'jklm' can't fit at 0.

0- 1- [ 9/4, 0, 0, 0, 0, 0, 0, 0 ]
1- 1- [ 3/3, 0, 0, 0, 0, 0, 0, 0 ]
2- 1- [ 6/3, 0, 0, 0, 0, 0, 0, 0 ]
3- 1- [ 13/4, 0, 0, 0, 0, 0, 0, 0 ]

but 'nop' can.

0- 1- [ 9/4, 0, 0, 0, 0, 0, 0, 0 ]
1- 1- [ 3/3, 0, 0, 0, 0, 0, 0, 0 ]
2- 1- [ 6/3, 0, 0, 0, 0, 0, 0, 0 ]
3- 1- [ 13/4, 0, 0, 0, 0, 0, 0, 0 ]
4- 1- [ 0/3, 0, 0, 0, 0, 0, 0, 0 ]

'jklm' could've with a split:

0- 1- [ 9/4, 0, 0, 0, 0, 0, 0, 0 ]
1- 1- [ 3/3, 0, 0, 0, 0, 0, 0, 0 ]
2- 1- [ 6/3, 0, 0, 0, 0, 0, 0, 0 ]
3- 2- [ 0/3, 13/1, 0, 0, 0, 0, 0, 0 ]

and with 'nop':

0- 1- [ 9/4, 0, 0, 0, 0, 0, 0, 0 ]
1- 1- [ 3/3, 0, 0, 0, 0, 0, 0, 0 ]
2- 1- [ 6/3, 0, 0, 0, 0, 0, 0, 0 ]
3- 2- [ 0/3, 13/1, 0, 0, 0, 0, 0, 0 ]
4- 1- [ 14/3, 0, 0, 0, 0, 0, 0, 0 ]

There's an easy chance you can beat DbfilenameShelf for your
application.- Hide quoted text -

- Show quoted text -

I am still interested in this one, but doubt if anyone still reading.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,764
Messages
2,569,564
Members
45,039
Latest member
CasimiraVa

Latest Threads

Top