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で質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルのマクロについて教えてください。 1 2023/02/03 13:18
- Excel(エクセル) 【VBA】指定フォルダに格納中のテキストファイルをエクセルで処理し結果のエクセルを新規フォルダに保存 1 2022/03/25 14:19
- その他(プログラミング・Web制作) Windowsのマクロプログラムで、こんなことできますか? 3 2022/06/28 14:30
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/21 09:42
- C言語・C++・C# 至急教えてください!プログラミングの問題です。 入力待ちをして、受け取った正の整数が表す行数だけ既存 4 2022/07/05 10:12
- Excel(エクセル) エクセルのマクロについて教えてください。 2 2023/02/04 12:47
- Visual Basic(VBA) vbaエクセルマクロについて あるデータを作成し、デスクトップに.xlsx形式で保存するマクロを作成 6 2023/03/03 18:05
- その他(プログラミング・Web制作) python OpenPyXLを使って出力結果をエクセルに書き込み 2 2022/06/04 19:46
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
- その他(パソコン・周辺機器) Windows10でXBOX360用RAPVX-SA用の非公式ドライバがインストール出来ない 1 2023/01/10 19:37
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
ファイル内のデータを1行削除する方法
C言語・C++・C#
-
ファイルの途中に文字列を挿入
C言語・C++・C#
-
C言語---ファイルに出力したデータをすべて消去する方法
C言語・C++・C#
-
-
4
C言語でテキストファイルの内容を置換して保存したい
C言語・C++・C#
-
5
バイナリーデータの一部データだけ変更する方法
C言語・C++・C#
-
6
関数から配列を返すには?
C言語・C++・C#
-
7
C言語 ファイルの指定された行を表示
C言語・C++・C#
-
8
【C言語】テキストファイル内のデータを一行削除
C言語・C++・C#
-
9
CSVファイルの特定行の削除
Visual Basic(VBA)
-
10
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
11
C++言語で、構造体のコピーは可能(しても良い)のでしょうか?
C言語・C++・C#
-
12
【C&C++】指定行のみファイル書き込み
C言語・C++・C#
-
13
visual studio でインデントを自動的に揃えるショートカットキー
その他(プログラミング・Web制作)
-
14
char*を初期化したいのですが
C言語・C++・C#
-
15
fgetsなどのときのstdinのバッファを消すには?
C言語・C++・C#
-
16
CStringのFindで文字列検索を行いたいのですが
C言語・C++・C#
-
17
c/c++でのファイルの上書き保存について
C言語・C++・C#
-
18
数字以外が入力されたらエラー文を出したい。
C言語・C++・C#
-
19
C言語でのファイルのデータ更新について
C言語・C++・C#
-
20
ファイルへの書込み処理が異常に遅い
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
JSPのNULLレコード表示について...
-
レコードが存在しなかった場合
-
ファイル書込みで一行もしくは...
-
Access を×ボタンで閉じ...
-
ADO VBA 実行時エラー3021
-
DataGridViewの内容をDBに反映...
-
アクセスでレポートの1印刷内...
-
Accessでレコードの更新を任意...
-
レコード長を数えてくれる関数
-
[VBA] ADOの Clone と AddNew
-
サブフォームに新規レコードを...
-
レコードセット(ADO.Recordset)...
-
Access でレコードセレクタが押...
-
差し込み印刷のレコード数について
-
サブレンジ分割されたNDB(富士...
-
SYLKファイルフォーマットについて
-
桁数を指定してファイルデータ...
-
ACCESSで大量の更新を行うと「...
-
DataGridViewの、選択されてい...
-
データベースへのinfoの入力
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ADO VBA 実行時エラー3021
-
カレントレコードが無い事を判...
-
レコードが存在しなかった場合
-
ファイル書込みで一行もしくは...
-
DataGridViewの内容をDBに反映...
-
差し込み印刷のレコード数について
-
ワードの差込印刷で教えて下さ...
-
レコードセット(ADO.Recordset)...
-
アクセスでレポートの1印刷内...
-
JSPのNULLレコード表示について...
-
Access でレコードセレクタが押...
-
Line Inputで文字化け(助けて...
-
ヘッダレコードとトレーラレコ...
-
DataGridViewの、選択されてい...
-
サブフォームに新規レコードを...
-
ACCESSで大量の更新を行うと「...
-
[VBA] ADOの Clone と AddNew
-
DataGridViewにてセル以外をク...
-
サブレンジ分割されたNDB(富士...
-
VB6.0のIsNull関数に相当するもの
おすすめ情報