std::fseek
定義於標頭檔案 <cstdio> |
||
int fseek( std::FILE* stream, long offset, int origin ); |
||
設定檔案流 stream 的檔案位置指示器。
如果 stream 以二進位制模式開啟,則新位置是從檔案開頭測量 offset 位元組,如果 origin 為 SEEK_SET,則從當前檔案位置測量,如果 origin 為 SEEK_CUR,則從檔案末尾測量,如果 origin 為 SEEK_END。二進位制流不要求支援 SEEK_END,尤其是在輸出額外的空位元組時。
如果 stream 以文字模式開啟,則 offset 唯一支援的值是零(適用於任何 origin)以及之前對與同一檔案關聯的流呼叫 std::ftell 返回的值(僅適用於 origin 為 SEEK_SET)。
如果 stream 是寬字元導向的,則文字流和二進位制流的限制都適用(允許 std::ftell 的結果與 SEEK_SET 一起使用,允許從 SEEK_SET 和 SEEK_CUR 使用零偏移量,但不允許從 SEEK_END 使用)。
除了更改檔案位置指示器之外,`fseek` 還會撤消 std::ungetc 的效果,並清除檔案結束狀態(如果適用)。
如果發生讀寫錯誤,則設定流的錯誤指示器 (std::ferror),並且檔案位置不受影響。
目錄 |
[編輯] 引數
stream | - | 要修改的檔案流 |
offset | - | 相對於 origin 移動的字元數 |
origin | - | offset 新增到的位置。它可以是以下值之一:SEEK_SET、SEEK_CUR、SEEK_END |
[編輯] 返回值
成功時為 0,否則為非零值。
[編輯] 注意
在寬流中尋找到非結束位置後,下次呼叫任何輸出函式可能會使檔案的其餘部分未定義,例如,透過輸出不同長度的多位元組序列。
POSIX 允許在現有檔案末尾之外進行查詢。如果在此查詢之後執行輸出,則從間隙讀取的任何資料都將返回零位元組。如果檔案系統支援,這會建立一個*稀疏檔案*。
POSIX 還要求如果存在任何未寫入的資料,`fseek` 首先執行 fflush(但移位狀態是否恢復是實現定義的)。標準 C++ 檔案流保證重新整理和不移位:std::basic_filebuf::seekoff。
POSIX 規定,`fseek` 在錯誤時應返回 -1,並設定 errno 以指示錯誤。
在 Windows 上,可以使用 `_fseeki64` 處理大於 2 GiB 的檔案。
[編輯] 示例
#include <cassert> #include <cstdio> #include <cstdint> #include <fstream> #include <vector> int main() { std::ofstream("dummy.nfo") << "8 bytes\n"; // create the file std::FILE* fp = std::fopen("dummy.nfo", "rb"); assert(fp); std::fseek(fp, 0, SEEK_END); // seek to end const std::size_t filesize = std::ftell(fp); std::vector<std::uint8_t> buffer(filesize); std::fseek(fp, 0, SEEK_SET); // seek to start std::fread(buffer.data(), sizeof(std::uint8_t), buffer.size(), fp); std::fclose(fp); std::printf("I've read %zi bytes\n", filesize); }
可能的輸出
I've read 8 bytes
[編輯] 另請參閱
將檔案位置指示器移動到檔案中特定位置 (函式) | |
獲取檔案位置指示器 (函式) | |
返回當前檔案位置指示器 (函式) | |
將檔案位置指示器移動到檔案開頭 (函式) | |
C 文件 用於 fseek
|