問題タブ [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.
php - ファイル ポインタにストリーム フィルタを適用しているときに予期しない値を報告する Ftell
ストリーム フィルターのftell適用中に使用して、ファイルに書き込まれたデータを計算しようとしています。zlib.deflateただし、ftellベースのサイズは、ファイルに書き込まれる実際のデータ サイズとは異なります。
以下は私のコードです
そして以下が結果です
c - fseek ftell 読み取り同じ入力
私は自分のプログラムに、子ごとに一度に 1 行を読み取らせようとしています (各行には 1 つの int が含まれています)。この読み取りを実行するたびに、最初の行を読み取り続けます。
これが私のコードの基礎です。
c++ - ファイルC++から偶数位置の数字を取得する
いくつかの浮動小数点数をバイナリ ファイルに書き込み、それを読み取って、偶数の位置にある数値のみを表示するこのプログラムを作成しました。現在、位置を確認してそこにあるものを表示する方法を理解するのに苦労しています。誰かがコードを見て、間違いがあるかどうか教えてください。どうすればそのように何かを表示できますか? ftell、fgetpos などをバイナリ ファイルで使用した場合の動作の正確な変更点についても少し混乱しています。どんな答えでも大歓迎です。コードは次のとおりです。
c++ - fgets() がファイル ポインタを正しく移動していないようです
別のアプリケーションによって同時に書き込まれているテキスト ファイルから読み取るアプリケーションがあります。ファイルを読み取るアプリケーションは、C - fopen を使用してテキスト モードでファイルを開きます。ファイル内の行は、最大数 100 MB のように大きくなる場合があります。このため、fgets を使用してファイルから 4K のチャンクを読み取り、完全な行を読み取ることができるまで文字列オブジェクトに追加する関数があります。ファイルに書き込んでいるアプリケーションが、読み取りを試みたときに部分的な行を書き込んだ可能性があります。Out カスタム ReadLine 関数は、ファイルの終わりを検出し、ファイル ポインターを最後の既知の適切な位置に再設定し、既に読み取られたテキストを破棄することで、このシナリオを処理します。
その関数は次のようになります。
問題: ファイルから行全体を読み取った後、ReadLine() 関数が次の行を読み取るために再度呼び出されたときに、以前に読み取った行から最後のチャンクを返すというシナリオに遭遇しました。ftell() によって返された lastOffset の値をログに記録したところ、そのまれなシナリオで、fgets が読み取った行の末尾にファイル ポインターを移動していないことに気付きました。
いくつかのデバッグ行を追加しましたが、私の場合、出力されたのは lastOffset 値だけでした。
ReadLine が不完全な行を返した呼び出しでは、lastOffset の値は次のとおりです: 21563617 不完全な行の長さ: 920
前の呼び出しで完全な行が返された場合、lastOffset の値は次のとおりです: 21442207 この前の呼び出しで読み取られた行の長さ: 122331 (改行を含む)
私の質問は次のとおりです。誰かが同様の問題に遭遇したことがありますか? 何がうまくいかない可能性があるかについて、あなたの意見は何ですか? 私は必ずしも完全な答えを探しているわけではありませんが、何がうまくいかない可能性があるかについてのいくつかの指針を探しています.
** アップデート **
小さなユーティリティで問題を再現することができました.4Kのチャンクでファイルに書き込み、10ミリ秒のスリープ間隔で、他のプログラム(上記の関数を使用する)が同じファイルから同時に読み取ります。
fseek() を実行してファイル ポインタを再設定するのは、上記の関数では不適切なオプションのようです。ファイル ポインタを前の位置に再設定しても、C ライブラリ自体の内部バッファがクリアされるとは限らないからです。場合によっては(再現ケース)、ファイルポインタのリセットが発生しなかったため、この説明にはまだ完全には納得していません。
とにかく、私は Web でさらに検索を行いました。一部のスレッドは、低レベルのストリームを使用し、ライブラリ自体でバッファリングを処理することを提案しているようです。そのため、上記の関数とその他のヘルパーの実装を変更して、それを行うようにしました。現在、Windows では _sopen_s()/_read()/_lseek() を使用し、Linux/Solaris では標準の POSIX インターフェイスを使用して、低レベルの IO 処理を実行しています。これらの変更により、機能しているように見えますが、問題はもう見られません。
ありがとうございました。皆様のご意見をお待ちしております。
スマン
** 更新 2 **
さて、私は確かにその理由を知っています。問題は、ファイルがテキスト モードで開かれている場合、ftell() と fseek() が信頼できないことです。ファイルがバイナリ モードで開かれている場合、上記の関数は正常に機能します。
これは、他の誰かが以前にこの問題を発見した記事へのリンクです: http://arstechnica.com/civis/viewtopic.php?f=20&t=420490
これは良いことです。200 行ではなく 1 行を変更する必要がある修正が得られたからです。:-)
c - Strange value for offset in fwrite
For the purpose of tracing I/O calls, I have overwritten fwrite in a shared library that I LD_PRELOAD when running a program. In my version of fwrite, I get the absolute offset of the write using
The value is then passed to a function that takes a size_t argument (so unsigned long), and the value is printed.
I encountered some calls with 18446744073709551615 as the offset (2^64 - 1), so I guess the initial long int returned by ftell was -1. These operations always wrote 10 bytes.
So my question is: what could have led the stream offset to be set to -1?
I don't trace the name of the files being accessed by those strange fwrites, so I don't know what is being accessed. Also I should precise that the program is an MPI program. It might be possible that the stream involved is actually a socket, or something else than a file...
php - PHP を使用した HTML5 の大容量 (>2GB) ビデオのストリーミング
わかりました、基本的に私は隠されたソースから MP4 ビデオをストリーミングする必要があるプロジェクトに取り組んでいます。
このフォーラムのほとんどの人がこの問題を抱えているので、私は以下から派生した解決策を使用しました: http://mobiforge.com/developing/story/content-delivery-mobile-devices
この問題は、(x86 マシンで) 2GB を超えるビデオ ファイルを処理しようとすると発生します。
filesize()私が最初に見つけた問題は、ファイルが 2GB を超えると負の値を返す php関数に関するものでした。この問題については、正しく機能する回避策を使用しています。
2 つ目は、いくつかのパラメーターが整数のように初期化されていて、ある時点で失敗したことでした... 代わりに浮動小数点数を使用して回避しました。
3 つ目は、整数を返すphpftell()関数 (ループ内で呼び出されているfilesize()) でした...そのため、関数と同じ問題があります。ftell()ループに入ったときに返される値は、パラメーターが持っている値と同じになるため、パラメーターと同じ値でループに入る新しいパラメーター$start(と呼びましょう$mm) で遊ぶことにしました。 $start、そして$bufferすべてのループでの値を追加するだけなので、関数を使用する必要はありませんftell()。
次のようになります ($startフロートであることを明確にしてください)。
$$mmすべてのループで同じ値をftell()持ちますが、何らかの理由で、この変更により、<2GB のファイルでも機能しません。ある時点で異なる値になる可能性があると考えたので、次の条件内にブレークポイントを配置しました。
の:
そして、それは決して止まらなかった...だから、私は少し迷っています.回避ループで何が間違っているのか知っていますか? この機能を回避するためにftell()機能する可能性のある他の回避策を知っていますか?
fortran - GFortran: 2GB を超えるファイルを読み取る
GFortran では、read および inquirepos=引数の値として 8 バイト整数を使用できますか?
GFortran には、2GB を超えるファイル位置を取得するための 8 バイト バージョンの ftell がありますか?
INTEL Fortran コンパイラには、8 バイト整数バージョンの ftell が呼び出されftelli8ていますが、Gfortran に関するものは何も見つかりません。
c - malloc() が十分なスペースを割り当てていない
こんにちは、ここに私の問題があります
私のコードは、ファイルを開いてその内容をメモリにロードするだけです。問題は、私が使用するときです
ファイルの全サイズではなく、4 バイトのみを割り当てます (つまり、短い文で単純な txt を開く場合は 25 バイト)。buffer最後にとのサイズを印刷するとfSize、それぞれ 4 と 25 になるので、fSize正しいです。なぜこれが起こっているのですか?
ありがとう、