名稱空間
變體
操作

std::fseek

來自 cppreference.com
< cpp‎ | io‎ | c
 
 
 
 
定義於標頭檔案 <cstdio>
int fseek( std::FILE* stream, long offset, int origin );

設定檔案流 stream 的檔案位置指示器。

如果 stream 以二進位制模式開啟,則新位置是從檔案開頭測量 offset 位元組,如果 originSEEK_SET,則從當前檔案位置測量,如果 originSEEK_CUR,則從檔案末尾測量,如果 originSEEK_END。二進位制流不要求支援 SEEK_END,尤其是在輸出額外的空位元組時。

如果 stream 以文字模式開啟,則 offset 唯一支援的值是零(適用於任何 origin)以及之前對與同一檔案關聯的流呼叫 std::ftell 返回的值(僅適用於 originSEEK_SET)。

如果 stream 是寬字元導向的,則文字流和二進位制流的限制都適用(允許 std::ftell 的結果與 SEEK_SET 一起使用,允許從 SEEK_SETSEEK_CUR 使用零偏移量,但不允許從 SEEK_END 使用)。

除了更改檔案位置指示器之外,`fseek` 還會撤消 std::ungetc 的效果,並清除檔案結束狀態(如果適用)。

如果發生讀寫錯誤,則設定流的錯誤指示器 (std::ferror),並且檔案位置不受影響。

目錄

[編輯] 引數

stream - 要修改的檔案流
offset - 相對於 origin 移動的字元數
origin - offset 新增到的位置。它可以是以下值之一:SEEK_SETSEEK_CURSEEK_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