
No.3ベストアンサー
- 回答日時:
この問題に対するよくある解決策です。
下に行くほど手間ですが大きなデータが扱えるようになります。1.ファイルが小さければ、全部配列に読み込んで、必要な操作を行ったあと同じファイル名で書き出す
2.ファイル名を変更してバックアップファイルとする作る。
バックアップを読み込み専用で開き、元のファイル名で新しいファイルを書き込みモードwで開く。
1行ずつfgetsで読み込み、ファイルにfputsで書き出す。
操作したい行が来たらその操作を行って同様にファイルに書き出す。
残りを全部書き出しす。
全部成功したらバックアップを削除する。エラーが起きたら編集中のファイルは削除してバックアップを元のファイル名にする
3.1行の長さを決まった長さにして(いわゆる固定長レコード)r+モードでfopenし、レコード長xレコード数で目的の場所にfseekして特定のレコードをfread/fwriteで上書きする。レコードの修正かレコードの末尾の追加の操作は効率がいい。レコードの挿入・削除が発生するときは全部fread/fwriteする。
4.ファイルが巨大で全部fread/fwriteするが重い処理になるなら、別途索引ファイル(インデックス)をつくり、レコードの追加はファイル末尾に追記し、インデックスファイルに検索キーとレコードの番号かファイルポインタの位置を記録する。これで目的のレコードがファイル中のどこにあるかを知ることができる。レコードの削除はインデックスに目印をつけるだけにして、実際にディスクから消去するのは負荷の低いときにガベージコレクションで行う。
5.4までやるくらいなら出来合いのデータベースを使うほうがよい。MySQLとかPostgresqlなど。
回答頂きありがとうございます。
今回はデータがあまり大きくなかったので1のように配列で処理しました。
ファイルの大きさなどにより、いろいろな手法があるのですね
次回の参考にさせて頂きます。
No.2
- 回答日時:
ありがとうございます。
一行読込(fgets)があったので一行書込みもあると思ったのですが
やはり出来ないみたいですね。
参考URLをもうちょっと調べてみます。
No.1
- 回答日時:
どの言語を使うのかわかりませんが、
ランダムデータ(バイナリデータ)なら可能ですが、
テキストデータの場合、基本的に部分的に書き込む事は出来ません。
しかし、テキストデータで特定の行を書き換える事は不可能ではありません。
要は、書き換えたい行のデータは変更して、それ以外のデータはそのままで、
1行目から最終行まで書き込めば、見た目で部分的な上書き保存になります。
これが一番単純でしょう。
ありがとうございます。
一行読込(fgets)があったので一行書込みもあると思ったのですが
やはり出来ないみたいですね。
一度全部読み込んで、特定行を変更・書込みですね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
【初月無料キャンペーン実施中】オンライン健康相談gooドクター
24時間365日いつでも医師に健康相談できる!詳しくはコチラ>>
-
ファイル内のデータを1行削除する方法
C言語・C++・C#
-
C言語---ファイルに出力したデータをすべて消去する方法
C言語・C++・C#
-
ファイルの途中に文字列を挿入
C言語・C++・C#
-
-
4
C言語でテキストファイルの内容を置換して保存したい
C言語・C++・C#
-
5
テキストファイルの行数を取得する方法(C言語
C言語・C++・C#
-
6
【C&C++】指定行のみファイル書き込み
C言語・C++・C#
-
7
【C言語】テキストファイル内のデータを一行削除
C言語・C++・C#
-
8
C言語 ファイルの指定された行を表示
C言語・C++・C#
-
9
C言語でのファイルのデータ更新について
C言語・C++・C#
-
10
Enterキーを押されたら次の処理に移るという事をしたい。
C言語・C++・C#
-
11
ファイルの結合
C言語・C++・C#
-
12
fopenのr+"モードで同時に読み書きする"
C言語・C++・C#
-
13
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
14
#defineの定数を文字列として読み込む
C言語・C++・C#
-
15
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
16
C言語 exitの使い方
C言語・C++・C#
-
17
DWORDの実際の型は何でしょうか
C言語・C++・C#
-
18
fopne で失敗する原因
C言語・C++・C#
-
19
ファイルから読み込んだデータを構造体に格納できますか?
C言語・C++・C#
-
20
あるディレクトリ内のファイルをファイル名でソートして取得
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
人気Q&Aランキング
-
4
JSPのNULLレコード表示について...
-
5
ワードの差込印刷で教えて下さ...
-
6
ADO VBA 実行時エラー3021
-
7
Line Inputで文字化け(助けて...
-
8
差し込み印刷のレコード数について
-
9
COBOLでのランダムアクセス
-
10
ACCESS VBA テーブルデータに...
-
11
VB6.0のIsNull関数に相当するもの
-
12
DataGridViewの、選択されてい...
-
13
レコードセット(ADO.Recordset)...
-
14
DataGridViewにてセル以外をク...
-
15
アクセスでレポートの1印刷内...
-
16
カレントレコードが無い事を判...
-
17
DataGridViewの内容をDBに反映...
-
18
固有レコード識別子の選択とは
-
19
Access でレコードセレクタが押...
-
20
サブフォームに新規レコードを...
おすすめ情報
公式facebook
公式twitter