move exercises, lecture examples, labs into subfolders
This commit is contained in:
51
Exercises/C18/ex6.c
Normal file
51
Exercises/C18/ex6.c
Normal file
@@ -0,0 +1,51 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
|
||||
int main() {
|
||||
FILE *fp; // file pointer
|
||||
float *data; // data pointer (array of floats)
|
||||
int i, file_size, arr_size;
|
||||
char filename[2049];
|
||||
|
||||
printf("Enter filename to read: ");
|
||||
scanf("%2048s", filename);
|
||||
|
||||
fp = fopen(filename, "rb");
|
||||
if (fp == NULL) {
|
||||
printf("Failed to open file\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
// get file size (technically isn't the best way because SEEK_END is undefined behaviour:
|
||||
//
|
||||
// "Library implementations are allowed to not meaningfully support SEEK_END
|
||||
// (therefore, code using it has no real standard portability)."
|
||||
// ~ https://cplusplus.com/reference/cstdio/fseek/
|
||||
//
|
||||
// " Setting the file position indicator to end-of-file, as with fseek(file, 0, SEEK_END),
|
||||
// has undefined behavior for a binary stream (because of possible trailing null characters) or
|
||||
// for any stream with state-dependent encoding that does not assuredly end in the initial shift
|
||||
// state. "
|
||||
// ~ https://port70.net/~nsz/c/c11/n1570.html#note268
|
||||
//
|
||||
// it is also limited to 2GB files as it returns a signed integer
|
||||
// better to use something like this probably:
|
||||
// https://stackoverflow.com/a/238609
|
||||
//
|
||||
// but louise uses fseek so i will too
|
||||
fseek(fp, 0, SEEK_END);
|
||||
file_size = ftell(fp);
|
||||
arr_size = file_size/sizeof(float);
|
||||
rewind(fp);
|
||||
|
||||
// allocate memory and read data
|
||||
data = malloc(file_size);
|
||||
fread(data, sizeof(float), arr_size, fp);
|
||||
|
||||
for (i = 0; i < arr_size; i++) {
|
||||
printf("%d %0.3f\n", i, data[i]);
|
||||
}
|
||||
|
||||
free(data);
|
||||
}
|
||||
Reference in New Issue
Block a user