問題タブ [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.UTF-8 を現在のロケールとして使用すると、fseek/ftell から予期しない結果が生じる
fseek と fgetpos の相互作用をテストしていたところ (より正確には、マルチバイト内にある fpos_t を取得できるかどうか)、かなり予期しない状況に陥りました。
setlocale(LC_CTYPE, "C.UTF-8");
andを使用するたびにfputwc
、 fseek
もう機能しないようで、ファイル内でカーソルを移動する唯一の方法は を使用することfgetwc
です。
コードは次のとおりです (すべての呼び出しは正常に完了します。つまり、setlocale、fseek、fputwc などです。簡潔にするために、戻り値のチェックを取り除きました)。
これは、glibc 2.16 を使用する Ubuntu で発生します。なぜこれが起こるのか、誰かが良い説明を持っていますか? これは glibc のバグですか?
いくつかのメモ:
ファイルを閉じて read more で再度開くと、すべてが期待どおりに機能します (位置がマルチバイト内にあるため
fseek
、ftell_out
/fpos_out
が適切1
でfgetwc
失敗した後)errno
私が使用しない場合
setlocale
、出力はほとんど期待どおりですfgetwc
が、もう設定されていませerrno
ん。
c - この関数で ftell が 0 を返すのはなぜですか?
プログラムを実行し、製品リストを表示することを選択すると、何も出力されません。しばらくすると、 の値fl_size
が常に 0 であることがわかりました。これはなぜですか?
python - Python でファイル記述子の位置を取得する
たとえば、生の数値ファイル記述子があり、それに基づいてファイル内の現在の位置を取得する必要があるとします。
次のコードlib
は、ファイル オブジェクトへのアクセスを許可しないコンパイル済みライブラリです。read
ループでは、処理されたデータを返す埋め込みメソッドを使用します。データとその長さはファイルの位置とは関係がないため、オフセットを数学的に計算することはできません。
fdopen
をas として使用しようとしましたが、ループ内で更新されていないファイルの最初の位置のみfd = fdopen(p.get_open_files()[0].fd)
が返されました。print fd.tell()
ファイル記述子に基づいて、ファイル内の現在のリアルタイム位置を取得する方法はありますか?
c - UTF-8 テキスト ファイルを処理するときに ftell/fgetpos が正しい位置を取得できない
VStudio 2012 + Win7 でテスト
UTF-8 テキスト ファイルには、わずか 5 バイトしか含まれていません。
テキストモードでは、次のように表示されます。
ソースも簡単です:
ただし、プログラムをデバッグするとき、1ftell()
番目は 2 ではなく 1 の位置値を返します...したがって、_fgetts()
2 番目のテキスト行に対して get が呼び出されると、 character ではなく CR マークが取得されるだけです2
。
テキストモードでファイルを処理するのに不備があるのではないかと思います(サンプルはモード"r,ccs=UTF-8"
でうまく機能します(編集:真ではありません!最初の ftell() は0を返します。指摘してくれてありがとうハンス))。(UTF-8テキストファイルにANSI以外の文字が含まれている場合に正しく動作するのはさらに奇妙です...しかし、最初に純粋なANSIファイルを解決しましょう。そして、はい、すでにフォーラムを検索しましたが、驚くべきことに同様の質問者は見つかりませんでした)"r"
ftell()
現在の最善の回避策は、"r"
モードで文字列行を読み取り、UTF-8 エンコーディングから Unicode エンコーディングに変換することです。より巧妙な提案があれば、本当に感謝します。
----- UPDATE 分割 (2015/03/25) -----
MinGW + Win7 および GCC + CentOS でのテスト
以下の要点について貴重なご意見を頂戴し、
- コンパイラの実装: Microsoft vs GNU @nm
@Hans Passantの不正確な内部バッファ使用
ftell()
- 固定長エンコーディング (例: "r" モード) と可変長エンコーディング (例: "r,css=UTF-8" モード)
- 1 文字の行末 (単一 LF) と 2 文字の行末 (CR+LF) @Hans Passant、@IInspectable
複合条件下で問題をテストすることにしました。
使用したテキストファイル
使用するソース (GNU コンパイラ用)
結果 #1: "r" モード、GNU+Win7
結果 #2: "r,ccs=UTF-8"モード、GNU+Win7、setlocale() あり/なし
結果 #3: "r,ccs=UTF-8" モード、GNU+ CentOS、WITH setlocale()
結論
- GNU+CentOS の場合、 が使用されている場合 (および
setlocale()
使用されている場合のみ)、ftell()
完全に機能します。これは、単一 LF の改行が Unix の標準であるためだと思います。 - ただし、Windows の場合、シングル LF または
"ccs=UTF-8"
モードのいずれかを使用するftell()
と、警告なしで不正確な戻り値が返されます...setlocale()
ここでは違いはありません。ただし、BOM が添付された UTF-8/UTF-16 ファイルは完全に処理できます...つまりftell()
、可変長エンコーディングを処理できる可能性があるということですか??
最後に、前に述べたように、"r"
モード (CR+LF 行末ルールへの準拠) は「世界を救う」でしょう.~
@Hans Passant、@ nm、何か見逃した場合は、結論を親切に修正してください。
php - a+ と fopen() を使用したモード
a/a+
マニュアルによると、関数内でモードを選択するfopen()
とファイルポインタが末尾に配置されるとのこと。
しかし、なぜ を使用して 0 を取得しftell()
、feof()
それでも を返すのfalse
でしょうか? ファイルポインタが最後にある場合。
例えば:
1になったのですが、ファイルポインタが最後にあると0になるのではないでしょうか?
c - ファイルから読み取り、オフセットを設定しますか?
私は C が初めてで、EOF までファイルをスキャンし、特定のキーワードを含む行を選択し、最後の行が検索された後にオフセットを設定する C プログラムを構築しようとしています。スキャンが再度実行されると、ファイルがスキャンされます。今回は、保存されたオフセットから始まり、EOF まで下方向に続きます。
ファイル I/O のさまざまな機能に頭を悩ませようとしていますが、fopen()、fseek()、fgets()、ftell() などを呼び出す手順をつなぎ合わせて、やりたいことを実行するのに苦労しています。することです。誰かが私を正しい方向に向けたり、これを行うために必要なことを説明したりできますか?
ありがとうございました!
android - ftello() および fseeko() Android ビルド エラー
64 ビット アーキテクチャ用の Android L を構築しようとしています。
私のコードは次のようになります:
以下ftello
のfseeko
エラーが発生しています:
fseeko
とについて確認ftello
しましたが、マニュアル ページでは_FILE_OFFSET_BITS
、値 64で定義するとoff_t
64 ビット型になることが記載されています。それでもこのエラーが表示されます。このエラーについて確認しましたが、満足のいく答えが見つかりませんでした。
誰かが私にこれを手伝ってくれると本当に助かります。
c++ - fseek、ftell によるセグメンテーション違反
私はFSEEKを使用してファイルの終わりまで、一度に2560 * 5バイトのステップを探しています。セグメンテーションの過失が得られている理由がわかりません。TDA2Xボードでこのコードを実行しています。
uNumFrames の開始値は 1000 です。このコードは基本的に、外部接続された SSD ドライブからデータを読み取ろうとしており、fseek を使用してファイル内の特定のコンテナーをスキップしながら、ファイルをバイト単位で読み取っています。私が直面している問題は、このようなファイルを読み取ろうとしているときに、コードが次の詳細でクラッシュすることです
サンプル出力は次のようになります。