問題タブ [ftell]
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 - Cでファイル内の行を上書きする、奇妙な出力
ファイルを 1 行ずつ調べて (各行は 50 文字以下)、各文字を 10 または -10 ずつシフトして (暗号化および復号化するため)、シフトされた文字列を古い文字列があった場所に出力しようとしています。しかし、私は本当に面白い出力を得ています。
コードは次のとおりです。
したがって、tester.csv が最初に読み取る場合
プログラムを実行すると生成されます
c++ - Cプログラミングfwriteがファイルの終わりにジャンプします
私はCモジュールを書いていますが、これまでに見たことのない興味深い問題に直面しています。
モジュールを実行すると、次のような印刷出力が表示されます。
ファイルポインタをファイルの先頭に設定しました。データを書き込むときは、目的の位置にデータを書き出してから、書き込まれたバイト数(この場合は8)でファイルの位置をインクリメントする必要があります。しかし、私がftellを実行すると、位置が突然6018(ファイルの元のサイズに8を加えたもの)にジャンプしたようです。
なぜこれが発生し、どうすればこの動作を防ぐことができますか?
c++ - C ++でのfwriteの作業
ファイルへの書き込みで競合状態をシミュレートしようとしています。これが私がやっていることです。
- process1 の追加モードで a.txt を開く
- process1 で「hello world」を書く
- 11 であるプロセス 1 の ftell を出力します。
- プロセス 1 をスリープ状態にする
- process2 の追加モードで a.txt を再度開きます
- process2 に「hello world」を書き込む (これはファイルの最後に正しく追加されます)
- 22 であるプロセス 2 の ftell を出力します (正しい)
- process2 に「bye world」と書き込みます (これはファイルの最後に正しく追加されます)。
- プロセス 2 が終了します
- process1 が再開し、その ftell 値である 11 を出力します。
- process1 で「bye world」を書き込む --- process1 の ftell が 11 であるため、ファイルが上書きされるはずです。
ただし、プロセス 1 の書き込みはファイルの末尾への書き込みであり、プロセス間での書き込みの競合はありません。
fopenを次のように使用していますfopen("./a.txt", "a+)
この動作の理由と、ファイルへの書き込みで競合状態をシミュレートするにはどうすればよいですか?
process1 のコード:
process2 では、ステートメントをコメントアウトしましたsleep
。
次のスクリプトを使用して実行しています。
御時間ありがとうございます。
c - より多くの文字が読み取られた場合、「ftell()」の戻り値は大きくなることが保証されていますか?
cplusplus.comの C ライブラリ リファレンスを注意深く読んだ後、 「テキスト ストリームの場合、 [ftell() によって返される]数値は意味がない可能性がある」ことを理解しています。
私の質問は次のとおりです。これは、たとえば 3000 文字を読み取ったときに返される値が、3 文字だけを読み取ったときに返される値よりも大きいことを絶対に確信できないということですか?
前もって感謝します、
ジョアン・シルバ。
c++ - ファイルを文字列バッファに読み込み、EOF を検出する
ファイルを開き、その内容を文字列バッファーに配置して、文字ごとに字句解析を行っています。このようにすると、後続のfread()呼び出しを使用するよりも速く解析を終了できます。また、ソース ファイルは常に数 MB を超えないため、ファイルの内容全体が常に読み取られるので安心できます。 .
ただし、ftell()はファイル内の実際の文字数よりも大きな整数値を返すことが多いため、解析するデータがなくなったことを検出する際に問題があるようです。これは、末尾の文字が常に -1 である場合、EOF (-1) マクロを使用しても問題にはなりません...しかし、常にそうであるとは限りません...
ファイルを開き、文字列バッファに読み込む方法は次のとおりです。
これは常に完全にうまく機能しているように見えます。これに続くのは単純なループで、次のように文字列バッファの内容を一度に 1 文字ずつチェックします。
ファイルの末尾のバイトは通常、一連のý (-3)および« (-85)文字であるため、EOF は検出されません。代わりに、nPos が fileSize よりも高い値になるまでループが続きます。これは、適切な語彙分析には望ましくありません。これは、末尾の改行文字を省略したストリームで最終トークンをスキップすることがよくあるためです。
Basic Latin 文字セットでは、EOF char が負の値を持つ任意の文字であると想定しても安全でしょうか? それとも、これを行うためのより良い方法がありますか?
#EDIT: feof()関数をループに実装しようとしましたが、EOF も検出されないようです。
c - main の fseek と ftell に相当するもの
メインで作業しているときとfseek
同等のものがあるかどうかを知りたいです。ftell
たとえば、尋ねられたときにファイルの名前を入力すると、最後に Enter キーを押します。次に、ユーザーに別のファイル名を尋ねますが、'\n'
読み取られなかったファイルがバッファにあります。プログラムは'\n'
. そこで、バッファ内で 1 つ前の位置に移動したいと思います。通常、私が行うファイルで:
ファイルを操作するのではなく、メインのときに同じことをしたいと思います。
c - ftell が正しくない値を返す
ftell が間違った値を返すという問題が発生しています。私のコードは、Linux の netbeans で実行すると正しく報告されますが、まったく同じコードを Windows の netbeans で (mingw を使用して) 実行すると、正しく報告されません。ファイル ポインタは、BINARY_READ で開かれたファイルへのポインタです。Linux の NetBeans では、サブルーチンを実行した後、ftell は 35 を報告します。私の Windows の NetBeans では、同じサブルーチンを呼び出した後、ftell は 3621 です。サブルーチンをトレースしたところ、次のステートメントが問題を引き起こしているようです。
私の Linux ネットビーンズでは、このステートメントの後の ftell(fp) は 1 になりますが、私の Windows ネットビーンズでは、このステートメントの後の ftell(fp) は 3585 です。
問題の原因は何ですか?