問題タブ [fseek]
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++ - 4GB を超えるファイルのサイズの決定
コードは現在これを行っており、fgetpos は 4GB を超えるファイルを処理しますが、シークはエラーを返しますfile > 4GB
。
c - fseek / ループで巻き戻す
レコードを行ごとに解析し、検証して別のファイルに書き込む巨大な関数があるコードに状況があります。
ファイルにエラーがある場合、レコードを拒否する別の関数を呼び出し、拒否理由を書き込みます。
プログラムのメモリ リークにより、SIGSEGV でクラッシュします。クラッシュした場所からファイルを「再起動」するための 1 つの解決策は、最後に処理されたレコードを単純なファイルに書き込むことでした。
これを実現するには、処理ループ内の現在のレコード番号をファイルに書き込む必要があります。ループ内のファイルでデータが上書きされるようにするにはどうすればよいですか?
ループ内で最初の位置/巻き戻しに fseek を使用すると、パフォーマンスが低下しますか?
レコードの数は、場合によってはロットにすることができます (最大 500K)。
ありがとう。
編集: メモリ リークは既に修正されています。再起動ソリューションは、追加の安全対策および SKIP n レコード ソリューションと共に再起動メカニズムを提供する手段として提案されました。先に言及せずに申し訳ありません。
c - fseek を使用してバックトラックする
fseek
キャラクター操作を後戻りするために使用することはfscanf
信頼できますか?
たとえば、fscanf
10 文字を編集したばかりで、10 文字をバックトラックしたい場合はどうすればよいfseek(infile, -10, SEEK_CUR)
ですか?
ほとんどの状況で機能しますが、キャラクターに問題があるようです^M
。どうやらfseek
それをcharとして登録しますが、fscanf
登録しません。したがって、前の例では、aを含む10文字のブロックが代わりに^M
必要になります。1文字短くします。fseek(infile, -11, SEEK_CUR)
fseek(infile, -10, SEEK_CUR)
これはなぜですか?
編集:fopen
テキストモードで使用していました
php - 変数に相当するPHP fseek()?
私が必要としているのは、PHP のfseek()
機能に相当するものです。この関数はファイルに対して機能しますが、バイナリ データを含む変数があり、それを処理したいと考えています。を使用できることはわかっていますsubstr()
が、それは不十分です。バイナリデータではなく、文字列に使用されます。また、ファイルを作成してから使用することも、fseek()
私が探しているものではありません。
多分ストリームで構築された何か?
編集:さて、私はほとんどそこにいます:
警告: ストリームを開けませんでした: rfc2397: 不正なパラメータ
c - C malloc / free+fgetsパフォーマンス
ファイルAの行をループするときに、行を解析し、各文字列(char*
)を。に入れchar**
ます。
行の終わりで、ファイルBを開き、を使用して、そのファイルから文字を取得する手順を実行しfgets
ます。次に、ファイルBを閉じます。fseek
fgetc
行ごとにファイルBの再オープンと再クローズを繰り返します。
私が知りたいのは:
を使用することでパフォーマンスが大幅に低下するため、動的ではなく静的なものを使用する必要があります
malloc
か?free
myArray[NUM_STRINGS][MAX_STRING_WIDTH]
char** myArray
ファイルBを開いたり閉じたりすることによるパフォーマンスのオーバーヘッドはかなりありますか(概念的には、何千回も)?ファイルAがソートされている場合、
fseek
ファイルBで「後方」に移動し、ファイルBで以前に配置されていた場所をリセットする方法はありますか?
編集2つのアプローチにより、実行時間が大幅に短縮されたことがわかりました。
私のファイルBは実際には24個のファイルの1つです。同じファイルB1を1000回開き、次にB2を1000回開くのではなく、ファイルB1を1回開き、閉じ、B2を1回、閉じるなどします。これにより、数千回の
fopen
操作fclose
が約24回に減ります。以前
rewind()
はファイルポインタをリセットしていました。
これにより、速度が約60倍向上しましたが、これで十分です。を指摘していただきありがとうございますrewind()
。
linux - ファイルのシーク位置に関する質問
前回の質問は生データの読み書きについてですが、新たな問題が発生しました。
lseek()
問題は、 orのような関数のパラメータfseek()
がすべて 4 バイトであることです。4G でスパンを移動したい場合、それは不可能です。私はWin32で関数があることを知っていますSetPointer(...,Hign, Low,....)
。このポインターは64バイトのポインターを生成できます。これは私が望むものです。
しかし、Linux または Unix でアプリを作成したい場合 (ファイルを作成するか、未加工のドライブ セクターに直接書き込みます)、どうすれば 4G 経由でポインターに移動できますか?
ありがとう、あなたの返事を待っています...
c - 更新モードでの読み取りと書き込みの間にfseekまたはfflushが常に必要なのはなぜですか?
fopen
Q:モードを使用して"r+"
、特定の文字列を読み取り、変更された文字列を書き戻すことによって、ファイルを所定の位置で更新しようとしていますが、機能しません。A:書き込む前に必ず呼び出して
fseek
ください。これは、上書きしようとしている文字列の先頭に戻るためと、読み取り/書き込み「+」モードでの読み取りと書き込みの間に常にfseek
orが必要なためです。fflush
私の質問は、読み取り/書き込み「+」モードでの読み取りと書き込みの間になぜ fseek
または常に必要なのかということです。AndrewKoenigのCTrapsand Pitfallsfflush
(1989)のセクション5.2は
、下位互換性の問題が原因であると述べています。誰かが詳細に説明できますか?
c - C プログラミング ftell fseek fread、ファイルの読み取りサイズ
ファイルがあります。ファイルのサイズを読みました。次に、ファイルの最後に到達するまで、一度に 2 バイトの読み取りをループします。すべての読み取り操作の後、現在の位置を 2 ずつインクリメントしますが、ファイルのサイズが半分になった後、位置はインクリメントされず、fread 操作は 0 バイトを読み取ります。
プログラムはファイルサイズを読み取ります。現在の位置がファイルのサイズと等しくなるまで、fread (毎回 2 バイト) を実行します。ファイルサイズに対して22915バイトを読み取ります。読み取りごとに位置を2ずつ増やしますが、現在の位置がファイルのサイズの半分である11459に達すると、ゼロバイトが読み取られるため、無限ループに入ります。
c++ - _fread_nolock、_fseek_nolockの使用目的は何ですか?
基本的にバイナリファイルからベクトルを読み書きするC++クラスがあります。単一のベクトルをメモリにロードする読み取り関数の例は、次のようになります。
OutプログラムはOpenMPでマルチスレッド化されており、複数のスレッドが同時に同じファイルにアクセスします。複数のスレッドによる問題を回避するために、OpenMPの重要なステートメント内で関数呼び出しを常にカバーしています。
Microsoft Visual C ++ランタイムには、、などのいくつかの関数が含まれていることを知っています...たとえば、関数は次のように記述されます_fseek_nolock
。_fread_nolock
_fwrite_nolock
_fread_nolock()
この関数は、freadの非ロックバージョンです。他のスレッドによる干渉から保護されていないことを除いて、freadと同じです。他のスレッドをロックアウトするオーバーヘッドが発生しないため、より高速になる可能性があります。この関数は、シングルスレッドアプリケーションなどのスレッドセーフなコンテキストで、または呼び出し元のスコープがすでにスレッドの分離を処理している場合にのみ使用してください。
今私の質問:関数が「再入可能」呼び出しをブロックすることを理解しているので、他のスレッドが戻る前に他のスレッドが関数に入ることがありません。しかし、なぜそのように単一の機能を保護する必要があるのか理解できません。IMHO(_file
コードサンプル内の)ファイルポインタにアクセス/変更するすべての関数は保護する必要があるため、スレッドセーフにする必要があります。これには、実際に標準のC関数fseekとfreadを呼び出す関数ブロック全体の周りにロックを構築する必要があるため、このような非ブロッキング関数を提供する意味がわかりません。
私たちのパラノイドロックスキームはパフォーマンスをいくらか浪費すると思うので、誰かが私にこれらのロックメカニズムを説明できますか?
前もって感謝します!
c - fseek()を使用してファイルの最後の50文字を読み取る
これを実行して、ファイルの最後の50文字を読み取ろうとしています。
これは、リモートで意味のあるものを返しません。なんで?