std::fsetpos
From cppreference.com
| ヘッダ <cstdio>で定義 |
||
| int fsetpos( std::FILE* stream, const std::fpos_t* pos ); |
||
指定されたストリームstreamのファイル位置指示子とマルチバイト解析状態(もしあれば)を、posが指す値に従って設定します。
新しい解析状態と位置を設定することに加えて、この関数を呼び出すと、std::ungetcの効果が取り消され、設定されている場合はファイル終端状態がクリアされます。
読み取りまたは書き込みエラーが発生した場合、ストリームのエラー指示子(std::ferror)が設定されます。
目次 |
[編集] パラメータ
| stream | - | 変更するファイルストリーム |
| pos | - | 同じファイルに関連付けられたストリームに対して呼び出されたstd::fgetposから取得されたfpos_tオブジェクトへのポインタ |
[編集] 戻り値
成功した場合は0、それ以外の場合はゼロ以外の値。失敗した場合はerrnoも設定されます。
[編集] 注記
ワイドストリームで末尾以外の位置にシークした後、次に出力関数を呼び出すと、ファイルの残りの部分が未定義になる可能性があります。たとえば、異なる長さのマルチバイトシーケンスを出力することによって。
[編集] 例
このコードを実行
#include <cstdio> #include <cstdlib> int main() { // Prepare an array of floating-point values. const int SIZE = 5; double A[SIZE] = {1., 2., 3., 4., 5.}; // Write array to a file. std::FILE * fp = std::fopen("test.bin", "wb"); std::fwrite(A, sizeof(double), SIZE, fp); std::fclose(fp); // Read the values into array B. double B[SIZE]; fp = std::fopen("test.bin", "rb"); std::fpos_t pos; if (std::fgetpos(fp, &pos) != 0) // current position: start of file { std::perror("fgetpos()"); std::fprintf(stderr, "fgetpos() failed in file %s at line # %d\n", __FILE__, __LINE__-3); std::exit(EXIT_FAILURE); } int ret_code = std::fread(B, sizeof(double), 1, fp); // read one value // current position: after reading one value std::printf("%.1f; read count = %d\n", B[0], ret_code); // print one value and ret_code if (std::fsetpos(fp, &pos) != 0) // reset current position to start of file { if (std::ferror(fp)) { std::perror("fsetpos()"); std::fprintf(stderr, "fsetpos() failed in file %s at line # %d\n", __FILE__, __LINE__-5); std::exit(EXIT_FAILURE); } } ret_code = std::fread(B, sizeof(double), 1, fp); // re-read first value std::printf("%.1f; read count = %d\n", B[0], ret_code); // print one value and ret_code std::fclose(fp); return EXIT_SUCCESS; }
出力
1.0; read count = 1 1.0; read count = 1
[編集] 関連項目
| ファイル位置指示子を取得する (関数) | |
| 現在のファイル位置指示子を返す (関数) | |
| ファイル位置指示子をファイル内の特定の場所に移動する (関数) | |
| Cドキュメント(fsetpos)
| |