lit
lit

Reputation: 19

Will SEEK_SET SEEK_CUR SEEK_END not be 0,1,2 on any C lib?

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

Answers (2)

Brad Lanam
Brad Lanam

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

chux
chux

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

Related Questions