問題タブ [seekg]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - fstream を使用したファイルの読み取りと書き込み
プログラミング: C++ を使用した原則と実践 Bjarne Stroustrup
- ファイルからすべての母音を削除するプログラム (「disemvowels」) を作成します。例えば、ワンス・アポン・ア・タイム!nc pn tm! になります。驚くべきことに、結果はまだ判読可能です。友達に試してみてください。
テキストファイルには「むかしむかし」が含まれています。
スイッチケース内でこのコードを試すと:
これらの文字「nc」ですべてのファイルを上書きする無限ループが発生します
このように私にとって唯一の仕事:
fs << ' ';
すでに増加しているのに、なぜ位置を設定する必要があるのですか?
c++ - ファイルの最後まで読んだ後にシークする
以下のコードを ifstream で 2 回使用しようとしています - ファイルから何かを読み取る前と、ファイルの最後まで読み取った後 (を使用readline()
)。
(m_startPosition
はファイルの途中にあります。この問題では重要ではありません。)
最初の実行では、コードは期待どおりに機能します。次に、2回目に実行すると、test1
を使用した後でも、変数の値は-1になりますclear()
。
私は同様の質問に目を通し、関数を使用すると言われているすべてのソリューションclear()
(私はすでに行っています)。
c++ - Seekg()は、意図した位置を超えて文字をスキップしているように見えますC++
ファイルの解析と seekg() の使用に問題がありました。ファイル内で特定の文字に到達するたびに、条件が満たされるまでループしたいと考えています。ループは最初の反復では正常に機能しますが、ループバックすると、ファイルが文字をスキップしているように見え、ループが期待どおりに動作しなくなります。
具体的には、ループがすべてファイル内の 1 行に含まれている場合、ループは正常に機能しますが、ファイル内のループ内に少なくとも 1 つの改行がある場合は失敗します。
私はWindowsでこれに取り組んでいることを言及する必要があります.Windowsが行を\r\n
.
ループバック後に使用seekg(-2, std::ios::cur)
すると、開始ループ条件の直後に改行が続く場合の問題が修正されますが、同じ行に含まれるループでは機能しません。
コードは、Interpreter クラスにファイル ポインターと関連する変数 (現在の行や列など) を保持させることによって構造化されています。このクラスには、次のように定義された機能マップもあります。
各文字を繰り返し処理し、次の関数で機能があるかどうかを判断します。
ループの開始 (「[」文字で示される) は、ループの開始位置をthis->temp_pos
次のように設定します。
ループの終わり (']' 文字で示される) に達したときに、ループを終了する条件が満たされない場合、ファイル カーソル位置はループの最初に戻されます。
デバッグ情報を入力し、問題をさらに明確にするためにスタック トレースを表示することができました。
1 行ループのスタック トレース ( ++[->+<]
):
これは意図したとおりに機能します。
複数行のループ:
スタックトレース:
終了条件が満たされないため、これは永久にループします (つまり、最初のセルの値は減分されないため、0 になることはありません)。
奇妙なことに、次のように動作します。
最初の例と同じスタック トレースに従います。これが機能し、最後の例が機能しないことが、この問題を解決するのを難しくしている原因です。
プログラムがどのように機能するか、またはその出力についてさらに情報が必要な場合はお知らせください。長い投稿で申し訳ありませんが、できるだけ明確にしたいだけです。
編集 1: クラスのファイル オブジェクトはstd::ifstream file;
. コンストラクターでは
、引数として渡されるthis->file.open(filename)
で開かれます。filename