From 04220af43446c75f5d1c30e6c26d113d00c7c8db Mon Sep 17 00:00:00 2001 From: Imbus <> Date: Sun, 7 Sep 2025 21:19:37 +0200 Subject: [PATCH] Filesize --- filesize.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 filesize.c diff --git a/filesize.c b/filesize.c new file mode 100644 index 0000000..3b61087 --- /dev/null +++ b/filesize.c @@ -0,0 +1,63 @@ +#include +#include +#include + +/* Different ways to get filesizes, some are linux-specific (i think), some are posix */ + +void file_tell(void); +void file_stat(void); +void file_end(void); + +int main(void) { + file_stat(); + file_tell(); + file_end(); + + return EXIT_SUCCESS; +} + +/* This works on linux, but may not be posix compliant */ +void file_stat(void) { + const char *filename = "filesize.c"; + struct stat st; + + if (stat(filename, &st) == 0) { + printf("File size: %lld bytes\n", (long long)st.st_size); + } else { + perror("stat"); + } +} + +/* This works on all posix systems afaik */ +void file_tell(void) { + FILE *f = fopen("filesize.c", "rb"); + if (!f) { + perror("fopen"); + return; + } + + fseek(f, 0, SEEK_END); + long size = ftell(f); + fclose(f); + + if (size >= 0) { + printf("File size: %ld bytes\n", size); + } else { + perror("ftell"); + } +} + +/* This is bad for obvious reasons*/ +void file_end(void) { + FILE *f = fopen("filesize.c", "rb"); + if (!f) + return; + + size_t size = 0; + while (fgetc(f) != EOF) { + size++; + } + fclose(f); + + printf("File size: %zu bytes\n", size); +}