read
その位置をシークしてから、コマンドとコマンドを使用してファイルを変更できwrite
ます。
ただし、これにはテキスト ファイルが煩わしいので、代わりにバイナリ ファイルを使用する必要があることに注意してください。
以下は、ファイルが存在しない場合は 256+16 文字 (16 + '\n' x 16) のファイルを作成し、ファイルが存在する場合は、から までの'#'
星を含む行を「描画」するプログラムです。'*'
x0
y0
x1
y1
try:
f = open("draw.txt", "rb+")
except IOError:
print "File was not present: creating it"
f = open("draw.txt", "wb+")
f.write(("#"*16 + "\n") * 16)
ランダムなシーク/書き込みの問題を回避するために、ファイルはバイナリモードで開かれていることに注意してください。
# Ask coordinates
x0 = int(raw_input("x0: "))
y0 = int(raw_input("y0: "))
x1 = int(raw_input("x1: "))
y1 = int(raw_input("y1: "))
# Line drawing DDA algorithm
dx = abs(x1 - x0)
ix = 1 if x0 < x1 else -1
dy = abs(y1 - y0)
iy = 1 if y0 < y1 else -1
m = max(dx, dy)
cx = cy = m >> 1
上記は、線の傾きと描画するピクセル数を計算するために必要です。実際の DDA ループは次のとおりです。
for i in xrange(m + 1):
if 0 <= x0 < 16 and 0 <= y0 < 16:
# Valid pixel; draw
f.seek(y0*17 + x0)
f.write('*')
# Move to next pixel
cx += dx
if cx >= m:
cx -= m
x0 += ix
cy += dy
if cy >= m:
cy -= m
y0 += iy
コードは次のようにシーク位置を計算することに注意してくださいy*(16+1)+x
。余分な1
ものは、各行に存在する改行文字用です。最後にファイルを閉じます。
# All done
f.close()
以下は、プログラムを 2 回実行した後のファイルの内容です。
################
################
###########*####
###*######*#####
####**####*#####
######**#*######
########**######
########*#**####
#######*########
######*#########
######*#########
#####*##########
################
################
################
################
上記のコードは、Linux またはその他の UNIX 系システムのファイルを処理します。Windows OS でテキスト ファイルが必要な場合は\r\n
、単に\n
. 代わりに が Mac の場合は、\r
代わりに\n
.
ファイルをテキスト モードで開くことは、(少なくとも正式には)ftell
線形スキャン中に読み取られた位置でのみシークが許可され、ファイルの途中で書き込むことが許可されていないため、機能することが保証されていません。