skip to Main Content

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%dn", SEEK_SET, SEEK_CUR, SEEK_END);
}

I’ve tested on some OSes and C compilers, where the output is just 012:

  • Windows: gcc(mingw), MSVC
  • Debian: clang, gcc
  • FreeBSD: clang
  • Solaris(SunOS5): Oracle Solaris Studio C Compiler
  • Android(Termux): clang

And if there’re none, then it’s less meaningful to add fix for the existing implementations using fixed values.

2

Answers


  1. 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
    
    Login or Signup to reply.
  2. 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 = %dn", 
            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.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search