On 10/10/12 11:02, Albert-Jan Roskam wrote:
I have a program that reads and writes files using ctypes.
Any particular reason why? That's not normally something I'd expect you
to need ctypes for. Unless you just want to play with ctypes...
When I want it to read AND write (e.g. read a file, select some stuff and write
that),
> the library returns a 'read-open' error.
Can we see the error messages please?
I think that the pointer to the file handle for read and write point to the
same address.
> To test that hypothesis, I wrote the simplified code below.
> Problem is, that I can't make it work
Again, what exactly is going wrong. "can't make it work is not too
helpful, we need specific descriptions of what went wrong with any error
messages.
How do I tell ctypes to use a particular chunck of memory,
> so read and write buffers do not mutually interfere?
In general you don't, you leave all that to the OS via the C libraries.
But you do need to think about what you are doing with the file. You
shouldn't open the same file simultaneously for read and write. If you
do need to do both use the combined 'rw' mode - but be aware that
getting simultaneous read/write behaviour right is hard!
Maybe the 'offset' parameter of ctypes.byref?
import ctypes
import platform
import os
import tempfile
# load libraries
pf = platform.platform().lower()
if pf.startswith("win"):
libc = ctypes.cdll.msvcrt
fopen = libc._fdopen
elif pf.startswith("lin"):
libc = ctypes.CDLL("libc.so.6")
fopen = libc.fdopen
elif pf.startswith("darwin"):
libc = ctypes.CDLL("libc.dylib")
fopen = libc.fdopen
else:
raise NotImplementedError
# create test data
path = tempfile.gettempdir()
os.chdir(path)
fn = "test.txt"
lines = 100 * (100 * "*" + os.linesep)
with open(fn, "wb") as f:
f.write(lines)
# read test data (code does NOT work)
fh = fopen(ctypes.c_char_p(fn), "rb")
fhPtr = ctypes.byref(ctypes.c_int(fh))
buff = ctypes.create_string_buffer(lines)
ret = libc.fread(buff, ctypes.c_int(1), ctypes.c_int(len(lines)), fhPtr)
print buff.value
# write test data (code does NOT work)
fn = "somefile.txt"
fh_out = fopen(ctypes.c_char_p(fn), "wb")
fh_outPtr = ctypes.byref(ctypes.c_int(fh_out))
buff = ctypes.create_string_buffer(lines)
ret = libc.fwrite(buff, ctypes.c_int(1), ctypes.c_int(len(lines)), fh_outPtr)
Again, what does "NOT work"? Does it work if you comment out one of the
blocks? I don't use ctypes much and certainly not for file handling so
can't be sure if the code is correct or not - maybe ask on a ctypes
forum for that...
--
Alan G
Author of the Learn to Program web site
http://www.alan-g.me.uk/
_______________________________________________
Tutor maillist - Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor