А, не, это все-таки будет работать, но как написано по ссылке
это плохой способ, результат может отличаться на разных компах, компиляторах.
Но в любом случае сделайте пока просто с одним байтом (тип n поменяйте на unsigned char), тогда просто без циклов один putc при записи, один getc при чтении. Когда заработает, можно попробовать int.
Ну и в любой непонятной ситуации добавляйте отладочный вывод (выводите все переменные в консоль).
Например, как-то так можно вывести байты (например, чтобы убедиться, что при сохранении и загрузке они совпадают):
#include <stdio.h>
int main()
{
int n = 42;
char* bytes = (char *)&n;
for (int i = 0; i < sizeof(int); i++)
{
char byte = *bytes++;
printf("%x ", byte);
}
return 0;
}
Откуда известно сколько элементов в файле до его чтения?
n по идее надо каким-то образом получать при чтении файла (либо читать сохраненное число, либо считать сколько элементов успешно прочиталось до конца файла) и возвращать из этой функции.
Текст из консоли лучше копировать, а не скриншотить, на то он и текст
csma в выводе похоже на мусор, что видимо означает, что чтение завершилось неудачно и в неинициализированном str остался мусор.
Проверяйте результат fgets + ferror, perror. http://www.cplusplus.com/reference/cstdio/fgets/
On success, the function returns str .
If the end-of-file is encountered while attempting to read a character, the eof indicator is set (feof). If this happens before any characters could be read, the pointer returned is a null pointer (and the contents of str remain unchanged).
If a read error occurs, the error indicator (ferror) is set and a null pointer is also returned (but the contents pointed by str may have changed).