0

ユーザーから与えられたデータ(int、floats、strings)を受け取り、それをテキストファイルに書き込むプログラムがあります。書き込んだデータの一部を更新する必要があります。

例えば:

ファイルの 4 行目で、最初の 2 つの単語を変更したいと思います ( anintと aがありますfloat)。どうやってやるの?

私が見つけた情報fseek()fputs()使用できますが、特定の行に到達する方法が正確にはわかりません。

(私はCのスターターなので、説明されたコードは高く評価されます)

4

3 に答える 3

4

ファイルに文字を「挿入」することはできません。ファイル全体を読み取り、新しいファイル、エディション、ファイルの残りの部分に挿入する前に一部をコピーするプログラムを作成する必要があります。

于 2013-03-26T18:20:17.503 に答える
1

本当にすべてのファイルを読み取り、必要のないものは無視する必要があります。

fseekあまり役に立ちません: ファイルをバイト オフセット (ファイルの先頭または末尾からの相対位置) に配置し、行の境界を認識しません。

実際、ファイル内の行は定義が不十分な概念です。多くの場合、行は、改行 ( ) で終わる一連のバイト (改行文字とは異なります'\n') です。一部のオペレーティング システム (Windows、MacOSX) は、特別な方法でテキスト ファイルを読み取ります (たとえば、実際のファイルには\r\n各行の末尾に含まれていますが、C ライブラリは、読んだような錯覚を与えます\n)。

実際には、行入力ルーチンを特にgetline(またはおそらくfgets) 使用することをお勧めします。

使用する場合は、ライン バッファーの処理にgetline注意する必要があります。free

テキスト ファイルの構造が非常に規則的である場合はfscanf、行の境界を気にせずに (スキップする必要があるものを無視して) データを削除する可能性があります。

絶対に使用したい場合fseek(これは間違いです)、ファイルを 2 回読み取る必要があります。1 回目は各行の開始 (または終了) を覚え、2 回目は行の開始点を覚えますfseek。それでも、ファイルの途中にバイトを挿入できないため、更新には機能しません。

そして実際には、最もコストのかかる操作は実際のディスク読み取りです。バッファリング (一部はカーネルと<stdio.h>関数によって実行され、一部は行を処理するときに実行されます) は無視できます。

もちろん、ファイル内の一部の行をその場で変更することはできません。それを行う必要がある場合は、入力用にファイルを処理し、出力ファイル (変更された入力を含む) を生成し、終了したら名前を変更します。

ところで、 GDBMなどのインデックス付きファイルや、 SqlLite 、 MariaDb 、 mongodb などのデータベースに興味があるかもしれませんまた JSONYAMLなど標準的なテキストのシリアライゼーション形式にも興味があるかもしれません(どちらにも多くのライブラリがあります)。 、C の場合でも、それらに対処するため)。

于 2013-03-26T18:17:46.367 に答える
0

fseek()データの各レコードが同じサイズであるランダム アクセス ファイルに使用されます。通常、データはテキストではなくバイナリです。

特定の問題を解決するには、一度に 1 行ずつ読んで、変更したい行を見つける必要があります。変更を行う簡単な解決策は、これらの行を一時ファイルに書き込み、変更を同じ一時ファイルに書き込み、元のファイルから変更したい部分をスキップして、リセットを一時ファイルにコピーすることです。最後に、元のファイルを閉じて一時ファイルをコピーし、一時ファイルを削除します。

そうは言っても、ランダムアクセスファイルについてもっと学ぶことをお勧めします。これらは、すべて同じサイズのレコードを格納する場合に非常に便利です。元のファイルの作成を制御できる場合は、現在の目的により適している可能性があります。

于 2013-03-26T18:20:22.770 に答える