1

したがって、次のようなテキスト ファイルがあります。

###############
###############
###############
###############
###############
###############
###############
###############
###############
###############
###############
###############
###############
###############

トラッカーを指定した座標に移動するコードをいくつか書きました (それは何と呼ばれていますか?)。

f = open('graphs.txt', 'r+')

while True:
    # TODO: Make an error if X or Y is greater than 15.
    x = input('X = ')
    y = input('Y = ')

    # this thing here finds which character to replace, 
    s = x + y * 16 # this is how far the tracker seeks
    f.seek(s)

残念ながら、トラッカーがオンになっている単一のキャラクターを操作する方法がわかりません。ファイルの読み書きに関して私が知っていることはすべて、基本的にファイル全体を変更することです。指定された単一の「#」を「*」に置き換える方法はありますか?

編集:私はそれを理解しましたが、今は新しい問題があります。

4

3 に答える 3

2

readその位置をシークしてから、コマンドとコマンドを使用してファイルを変更できwriteます。

ただし、これにはテキスト ファイルが煩わしいので、代わりにバイナリ ファイルを使用する必要があることに注意してください。

以下は、ファイルが存在しない場合は 256+16 文字 (16 + '\n' x 16) のファイルを作成し、ファイルが存在する場合は、から までの'#'星を含む行を「描画」するプログラムです。'*'x0y0x1y1

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線形スキャン中に読み取られた位置でのみシークが許可され、ファイルの途中で書き込むことが許可されていないため、機能することが保証されていません。

于 2013-11-03T13:46:12.003 に答える
-2

ファイル全体を文字列として読み取ります。次に、必要な文字とその方程式のインデックスを置き換えます。

stringthing = file.read //or whatever the read command is
stringthing[s] = '[whatever your char is]'
[write stringthing to file]

役に立った?

于 2013-11-03T13:30:09.300 に答える