add support for seeking to the end of a file
This commit is contained in:
@ -767,9 +767,15 @@ bigint platform::ftell(FILE *fp)
|
|||||||
int platform::fseek(FILE *fp, bigint pos)
|
int platform::fseek(FILE *fp, bigint pos)
|
||||||
{
|
{
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
return ::_fseeki64(fp, (__int64) pos, SEEK_SET);
|
if (pos == platform::END_OF_FILE)
|
||||||
|
return ::_fseeki64(fp, 0, SEEK_END);
|
||||||
|
else
|
||||||
|
return ::_fseeki64(fp, (__int64) pos, SEEK_SET);
|
||||||
#else
|
#else
|
||||||
return ::fseek(fp, (long) pos, SEEK_SET);
|
if (pos == platform::END_OF_FILE)
|
||||||
|
return ::fseek(fp, 0, SEEK_END);
|
||||||
|
else
|
||||||
|
return ::fseek(fp, (long) pos, SEEK_SET);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -263,7 +263,12 @@ namespace platform {
|
|||||||
|
|
||||||
bigint ftell(FILE *fp);
|
bigint ftell(FILE *fp);
|
||||||
|
|
||||||
|
/*! constant to seek to the end of the file */
|
||||||
|
constexpr bigint END_OF_FILE = -1;
|
||||||
|
|
||||||
/*! Set absolute file position
|
/*! Set absolute file position
|
||||||
|
*
|
||||||
|
* If the absolute position is END_OF_FILE, then position at the end of the file.
|
||||||
*
|
*
|
||||||
* \param fp FILE pointer of the given file
|
* \param fp FILE pointer of the given file
|
||||||
* \param pos new position of the FILE pointer
|
* \param pos new position of the FILE pointer
|
||||||
|
|||||||
@ -170,7 +170,9 @@ TEST(Platform, fseek_ftell)
|
|||||||
ASSERT_EQ(platform::fseek(fp, 15), 0);
|
ASSERT_EQ(platform::fseek(fp, 15), 0);
|
||||||
ASSERT_EQ(fgetc(fp), '6');
|
ASSERT_EQ(fgetc(fp), '6');
|
||||||
fflush(fp);
|
fflush(fp);
|
||||||
fseek(fp, -1, SEEK_END);
|
ASSERT_EQ(platform::fseek(fp, platform::END_OF_FILE), 0);
|
||||||
|
ASSERT_EQ(platform::ftell(fp), 21);
|
||||||
|
ASSERT_EQ(platform::fseek(fp, 20), 0);
|
||||||
ASSERT_EQ(fgetc(fp), 0);
|
ASSERT_EQ(fgetc(fp), 0);
|
||||||
ASSERT_EQ(platform::ftell(fp), 21);
|
ASSERT_EQ(platform::ftell(fp), 21);
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
|
|||||||
Reference in New Issue
Block a user