
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も見ています
-
ファイル内のデータを1行削除する方法
C言語・C++・C#
-
C言語でテキストファイルの内容を置換して保存したい
C言語・C++・C#
-
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
-
4
C言語のfopenについて教えてください。
C言語・C++・C#
-
5
【C&C++】指定行のみファイル書き込み
C言語・C++・C#
-
6
fopenで別ディレクトリにファイルをオープンしたい
C言語・C++・C#
-
7
ファイルの途中に文字列を挿入
C言語・C++・C#
-
8
C言語 ファイルの指定された行を表示
C言語・C++・C#
-
9
CString型 全角半角を意識せずに「1文字」ずつ取り出す
C言語・C++・C#
-
10
VC++でUTF-8のファイルを出力したい
C言語・C++・C#
-
11
【C言語】テキストファイル内のデータを一行削除
C言語・C++・C#
-
12
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
13
C言語---ファイルに出力したデータをすべて消去する方法
C言語・C++・C#
-
14
C言語での引数の省略方法
C言語・C++・C#
-
15
fgetsなどのときのstdinのバッファを消すには?
C言語・C++・C#
-
16
Enterキーを押されたら次の処理に移るという事をしたい。
C言語・C++・C#
-
17
バイナリーデータの一部データだけ変更する方法
C言語・C++・C#
-
18
実行ファイルのパスを取得したい
C言語・C++・C#
-
19
C言語でのファイルのデータ更新について
C言語・C++・C#
-
20
DWORDの実際の型は何でしょうか
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
レコード長を数えてくれる関数
-
DataGridViewにてセル以外をク...
-
ワードの差込印刷で教えて下さ...
-
カレントレコードが無い事を判...
-
DAO、ADOについて
-
レコードが存在しなかった場合
-
ファイル書込みで一行もしくは...
-
実績累計の求め方と意味を教え...
-
決定性有限オートマトン
-
エクセルデータの末尾の改行を...
-
【SQL】existsでの商演算
-
select文でフリーズします。
-
ACCESS VBA レコードセットの参...
-
SELECTで1件のみ取得するには?
-
チェックボックスの項目をDBにi...
-
改行コード
-
ACCESSのクエリで同じSQL文だが...
-
こういうDELETE文を作成したい...
-
アクセス クエリ-で空白以外の...
-
SQL文で右から1文字だけ削除す...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DataGridViewの、選択されてい...
-
ファイル書込みで一行もしくは...
-
レコードが存在しなかった場合
-
ADO VBA 実行時エラー3021
-
JSPのNULLレコード表示について...
-
差し込み印刷のレコード数について
-
アクセスでレポートの1印刷内...
-
DataGridViewの内容をDBに反映...
-
サブフォームに新規レコードを...
-
ACCESSで大量の更新を行うと「...
-
カレントレコードが無い事を判...
-
ワードの差込印刷で教えて下さ...
-
[VBA] ADOの Clone と AddNew
-
サブレンジ分割されたNDB(富士...
-
固有レコード識別子の選択とは
-
データセットのレコード更新が...
-
レコードセット(ADO.Recordset)...
-
ヘッダレコードとトレーラレコ...
-
Access を×ボタンで閉じ...
-
ACCESS VBA テーブルデータに...
おすすめ情報