Файлы, чтение и запись структур в C

А, не, это все-таки будет работать, но как написано по ссылке

это плохой способ, результат может отличаться на разных компах, компиляторах.

Но в любом случае сделайте пока просто с одним байтом (тип 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;
}

https://onlinegdb.com/HJzVbva38

:sob:

А что я здесь неправильно сделал?

int save (struct zvezda A[], int n)
{
	FILE *file;
	char fname[20];
	int  i;

	printf("Введите имя файла, в который будут сохранены существующие записи: ");
	scanf ("%s", fname);
	file=fopen(fname, "w");
	if (file == NULL)
	{
		printf("Возникла ошибка!");
		return(0);
	}
	
	for (i = 0; i != n; i++) 
	{
		fprintf(file, "%s\n", A[i].zv_name);
		fprintf(file, "%lg %lg %s %lg %d %d", A[i].zv_velichina, A[i].l.ras, (A[i].l.godkm ? "св.лет" : "км"), A[i].k.ugol, A[i].k.chas, A[i].k.min);
	}
	
	fclose(file);
	return 0;
}

int load (struct zvezda A[], int n)
{
	FILE *file;
	char fname[20];
	int i;
	
	printf("Введите имя файла, из которого будут загружены записи: ");
	scanf ("%s", fname);
	file=fopen(fname, "r");
	if (file == NULL)
	{
		printf("Возникла ошибка!");
		return(0);
	}
	
	for (i = 0; i != n; i++) 
	{
		fgets(A[i].zv_name, 20, file);
		fscanf(file, "%lg%lg%s%lg%d%d", A[i].zv_velichina, A[i].l.ras, (A[i].l.godkm ? "св.лет" : "км"), A[i].k.ugol, A[i].k.chas, A[i].k.min);
	}
	printf("%s %lg %lg %s %lg %d %d", A[i].zv_name, A[i].zv_velichina, A[i].l.ras, (A[i].l.godkm ? "св.лет" : "км"), A[i].k.ugol, A[i].k.chas, A[i].k.min);

        fclose(file);
        return 0;
}

Так а результат-то какой?) Что происходит?

Записывается так, как и задумано.

а читается немного вообще не так…

Ребята, ну помогите, пожалуйста, составить эти две функции сохранения и загрузки массива структур в файл на основе: https://metanit.com/cpp/c/7.3.php!

а если пробелы добавить?)

Откуда известно сколько элементов в файле до его чтения?

n по идее надо каким-то образом получать при чтении файла (либо читать сохраненное число, либо считать сколько элементов успешно прочиталось до конца файла) и возвращать из этой функции.


Текст из консоли лучше копировать, а не скриншотить, на то он и текст :wink:

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).