teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

微修正

2020/04/22 00:34

投稿

teamikl
teamikl

スコア8817

answer CHANGED
@@ -9,7 +9,7 @@
9
9
  - 最後にファイルをリネーム
10
10
 
11
11
  という過程が必要になり、
12
- ファイルが大きくなる程、無駄なファイルの入出力大きくなります。
12
+ ファイルが大きくなる程、無駄なファイルの入出力大きくなります。
13
13
 
14
14
  また、読み書きの時間が長くなるとファイル破損のリスクが大きくなるので、
15
15
  実際に運用する場合は、(データの重要度次第で)ロックファイルを用いた排他制御等々が必要になってきます。

3

誤った説明であったため訂正

2020/04/22 00:34

投稿

teamikl
teamikl

スコア8817

answer CHANGED
@@ -2,9 +2,11 @@
2
2
 
3
3
  行指向のテキストファイルの場合 (**シーケンシャル・アクセス**)
4
4
 
5
+ - 一時的に別ファイルに全内容を書き出します。(追記)
5
- - 指定行までを数えながら毎行読み込んで、読み飛ばし
6
+ - 指定行までを数えながら毎行読み込んで、~~読み飛ばし~~ 書き出し
6
- - 該当行を書き
7
+ - 該当行を書き込む
7
- - 残りの行を新たに書き込む
8
+ - 残りの行を書き込む
9
+ - 最後にファイルをリネーム
8
10
 
9
11
  という過程が必要になり、
10
12
  ファイルが大きくなる程、無駄なファイルの入出力が大きくなります。

2

キーワードを太字に

2020/04/22 00:32

投稿

teamikl
teamikl

スコア8817

answer CHANGED
@@ -1,6 +1,6 @@
1
1
  > txtファイルへ出力された文字を、行指定しながら上書きしたいのですが、
2
2
 
3
- 行指向のテキストファイルの場合 (シーケンシャル・アクセス)
3
+ 行指向のテキストファイルの場合 (**シーケンシャル・アクセス**)
4
4
 
5
5
  - 指定行までを数えながら毎行読み込んで、読み飛ばし
6
6
  - 該当行を上書き
@@ -15,7 +15,7 @@
15
15
  ----
16
16
  > 追記でなく、文字列の変更をしたいとなるとどのような方法があるでしょうか??
17
17
 
18
- データが固定長のバイナリファイルであれば、(ランダム・アクセス)
18
+ データが固定長のバイナリファイルであれば、(**ランダム・アクセス**)
19
19
  例えば、レコードの最大値を決めておくと、読み出し位置が計算で求まるので
20
20
 
21
21
  - 指定レコード迄をseek()で読み飛ばし

1

説明補足

2020/04/21 23:01

投稿

teamikl
teamikl

スコア8817

answer CHANGED
@@ -27,6 +27,8 @@
27
27
  但し、コメント等の何文字入力されるかわからない可変長のテキストを含む場合には向いてません。
28
28
 
29
29
  ----
30
- 書き出すデータが少量なら、readlines()で全ての行を読込んで、
30
+ 他の簡易な方法として、書き出すデータが少量なら、readlines()で全ての行を読込んで、
31
- 該当行を変更した後にファイル全体を書き出し等でも良いですが、
31
+ 該当行を変更した後にファイル全体を書き出し等でも良いですが、メモリにデータを読み込む為、
32
+ データが大きくなると当然占有メモリも大きくなります。
33
+
32
34
  データの規模が大きくなる場合は、sqlite3 等のデータベースの利用がお勧めです。