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++・C#
-
6
fgetsなどのときのstdinのバッファを消すには?
C言語・C++・C#
-
7
同じ名前のファイルを作った場合に上書きしてしまうのですが、どうすれば上書きしないで保存できるのでしょうか?
C言語・C++・C#
-
8
DWORDの実際の型は何でしょうか
C言語・C++・C#
-
9
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
10
char*を初期化したいのですが
C言語・C++・C#
-
11
c/c++でのファイルの上書き保存について
C言語・C++・C#
-
12
C言語でのファイルのデータ更新について
C言語・C++・C#
-
13
C++のfor文について
C言語・C++・C#
-
14
文字列から空白を取り除きたいのですが
C言語・C++・C#
-
15
C言語 ファイルの指定された行を表示
C言語・C++・C#
-
16
C++言語で、構造体のコピーは可能(しても良い)のでしょうか?
C言語・C++・C#
-
17
数字以外が入力されたらエラー文を出したい。
C言語・C++・C#
-
18
ファイルから読み取った改行文字を消す方法
C言語・C++・C#
-
19
C言語で複数列のデータを1列のみ読み込みたい
C言語・C++・C#
-
20
バイナリーデータの一部データだけ変更する方法
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
カレントレコードが無い事を判...
-
ファイル書込みで一行もしくは...
-
[VBA] ADOの Clone と AddNew
-
DataGridViewにてセル以外をク...
-
アクセスでレポートの1印刷内...
-
VB6.0のIsNull関数に相当するもの
-
レコードセット(ADO.Recordset)...
-
エラー番号=5 制約を有効にで...
-
ADO VBA 実行時エラー3021
-
JSPのNULLレコード表示について...
-
Javaで使用するデータベースの...
-
Access でレコードセレクタが押...
-
Access を×ボタンで閉じ...
-
DataGridViewの内容をDBに反映...
-
【ExcelVBA】Powerクエリーでい...
-
ACCESSで大量の更新を行うと「...
-
サブフォームに新規レコードを...
-
確認ダイアログを出さないでレ...
-
AccessVBAのMoveメソッドにつき...
-
DataGridViewの、選択されてい...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ADO VBA 実行時エラー3021
-
ファイル書込みで一行もしくは...
-
レコードが存在しなかった場合
-
アクセスでレポートの1印刷内...
-
JSPのNULLレコード表示について...
-
カレントレコードが無い事を判...
-
DataGridViewの、選択されてい...
-
差し込み印刷のレコード数について
-
ACCESSで大量の更新を行うと「...
-
DataGridViewの内容をDBに反映...
-
Access でレコードセレクタが押...
-
固有レコード識別子の選択とは
-
レコードセット(ADO.Recordset)...
-
Access を×ボタンで閉じ...
-
DataGridViewにてセル以外をク...
-
ヘッダレコードとトレーラレコ...
-
ワードの差込印刷で教えて下さ...
-
サブレンジ分割されたNDB(富士...
-
データセットのレコード更新が...
-
[VBA] ADOの Clone と AddNew
おすすめ情報