add support for seeking to the end of a file

This commit is contained in:
Axel Kohlmeyer
2021-10-05 15:44:58 -04:00
parent 741cf9c7d5
commit af070aa351
3 changed files with 16 additions and 3 deletions

View File

@ -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
} }

View File

@ -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

View File

@ -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);