Reputation: 19
For whence
parameter of fseek
(or lseek
in POSIX), some languages that calls C lib assume SEEK_SET
, SEEK_CUR
, SEEK_END
are 0,1,2, respectively, such as gfortran, Nim [^py].
[^py]: while Python's seek specializes concrete values of SEEK_*
, CPython does map 0,1,2 to C lib's values internally.
I've looked up C and POSIX specialization, neither specializes concrete values of SEEK_*
.
In code, I wonder in which OS and C compiler, the following code's output isn't 012
:
#include <stdio.h>
int main(){
printf("%d%d%d\n", SEEK_SET, SEEK_CUR, SEEK_END);
}
I've tested on some OSes and C compilers, where the output is just 012
:
And if there're none, then it's less meaningful to add fix for the existing implementations using fixed values.
Upvotes: 0
Views: 87
Reputation: 5723
In the ideal instance, you would want to write a C program to create an include file for the constants for the language that does not have those constants defined. e.g.
#include <stdio.h>
int
main (int argc, char *argv [])
{
printf ("INTEGER, PARAMETER :: SEEK_SET = %d, SEEK_CUR = %d, SEEK_END = %d\n",
SEEK_SET, SEEK_CUR, SEEK_END);
}
I have no idea what fortran include files look like, this would need to be fixed.
In this particular instance, SEEK_SET, SEEK_CUR and SEEK_END are well defined as 0, 1, and 2, and you aren't going to have a problem with them.
Upvotes: 1
Reputation: 153498
Will SEEK_SET SEEK_CUR SEEK_END aren't 0,1,2 on any C lib?
Maybe. Yet if not today, maybe tomorrow.
If you must use 0, 1, 2 in calling fseek()
, use the number as an array index.
I doubt there is a real case where one must do so.
#include <stdio.h>
const int whence [] = { SEEK_SET, SEEK_CUR, SEEK_END };
int result = fseek(stream, 0, whence[2]); // Go to the end
Upvotes: 1