0

For directories fopen with rb mode return non-null value. For some folders fseek with SEEK_END return 0, for others return -1. For which fseek return 0 ftell return INT64_MAX.

Why is this happening? Why is it possible to call fopen for directories with rb mode?

OS: Ubuntu 22.04.1 LTS

clang --version: Ubuntu clang version 14.0.6

Compile command: clang main.c -o main

#include <stdio.h>
#include <gnu/libc-version.h>

void test_open(const char* filename){
   printf("\nPath = %s\n", filename);
   FILE* file = fopen(filename, "rb");
   if (!file) {
      puts("Not found!\n");
      return;
   }
   size_t size = 0;
   printf("fseek 0 SEEK_END = %d\n", fseek(file, 0, SEEK_END));
   long length = ftell(file);
   printf("ftell = %ld\n", length);
   printf("fseek 0 SEEK_SET = %d\n", fseek(file, 0, SEEK_SET));
   fclose(file);
}

int main(int argc, char **argv) {
   puts(gnu_get_libc_version());
   test_open("/");
   test_open("/home/");
   test_open("/home/user/");
   test_open("/home/user/test_src/");
   test_open("/home/user/test_src/subdir/");
   return 0;
}

Output:

2.37

Path = /
fseek 0 SEEK_END = -1
ftell = 0
fseek 0 SEEK_SET = 0

Path = /home/
fseek 0 SEEK_END = -1
ftell = 0
fseek 0 SEEK_SET = 0

Path = /home/user/
fseek 0 SEEK_END = -1
ftell = 0
fseek 0 SEEK_SET = 0

Path = /home/user/test_src/
fseek 0 SEEK_END = 0
ftell = 9223372036854775807
fseek 0 SEEK_SET = 0

Path = /home/user/test_src/subdir/
fseek 0 SEEK_END = 0
ftell = 9223372036854775807
fseek 0 SEEK_SET = 0
tereshi
  • 1
  • 1
  • Whoever is teaching you to use `fseek()`/`ftell()` to get the size of a file is unaware that doesn't work reliably. https://port70.net/~nsz/c/c11/n1570.html#note268: "Setting the file position indicator to end-of-file, as with `fseek(file, 0, SEEK_END)`, **has undefined behavior for a binary stream**..." – Andrew Henle Apr 12 '23 at 12:54

0 Answers0