Skip to content

Instantly share code, notes, and snippets.

@vlaleli
Created May 26, 2025 16:42
Show Gist options
  • Select an option

  • Save vlaleli/fbb14bf6b4face25e336130325fd6c8e to your computer and use it in GitHub Desktop.

Select an option

Save vlaleli/fbb14bf6b4face25e336130325fd6c8e to your computer and use it in GitHub Desktop.
#include <cstdio>
#include <cstdlib>
// Аналог strlen, считает длину C-строки
int my_strlen(const char* str) {
int len = 0;
while (str[len] != '\0') {
++len;
}
return len;
}
struct Student {
char* name;
int age;
float grade;
};
char* readLine() {
size_t size = 16;
size_t len = 0;
char* buffer = (char*)malloc(size);
if (!buffer) return nullptr;
int c;
while ((c = getchar()) != '\n' && c != EOF) {
buffer[len++] = (char)c;
if (len == size) {
size *= 2;
char* tmp = (char*)realloc(buffer, size);
if (!tmp) {
free(buffer);
return nullptr;
}
buffer = tmp;
}
}
buffer[len] = '\0';
return buffer;
}
int main() {
int n;
printf("Скільки студентів хочеш ввести? ");
if (scanf("%d", &n) != 1 || n <= 0) {
printf("Невірна кількість студентів.\n");
return 1;
}
int ch;
while ((ch = getchar()) != '\n' && ch != EOF);
Student* students = (Student*) malloc(n * sizeof(Student));
if (!students) {
printf("Помилка виділення пам'яті.\n");
return 1;
}
for (int i = 0; i < n; ++i) {
printf("Студент #%d\n", i + 1);
printf("Ім'я: ");
char* name = readLine();
if (!name) {
printf("Помилка вводу імені.\n");
for (int j = 0; j < i; ++j)
free(students[j].name);
free(students);
return 1;
}
students[i].name = name;
printf("Вік: ");
if (scanf("%d", &students[i].age) != 1) {
printf("Помилка вводу віку.\n");
for (int j = 0; j <= i; ++j)
free(students[j].name);
free(students);
return 1;
}
printf("Середній бал: ");
if (scanf("%f", &students[i].grade) != 1) {
printf("Помилка вводу середнього балу.\n");
for (int j = 0; j <= i; ++j)
free(students[j].name);
free(students);
return 1;
}
while ((ch = getchar()) != '\n' && ch != EOF);
}
FILE* file = fopen("students.dat", "wb");
if (!file) {
printf("Не вдалося відкрити файл для запису.\n");
for (int i = 0; i < n; ++i)
free(students[i].name);
free(students);
return 1;
}
fwrite(&n, sizeof(int), 1, file);
for (int i = 0; i < n; ++i) {
int name_len = my_strlen(students[i].name);
fwrite(&name_len, sizeof(int), 1, file);
fwrite(students[i].name, sizeof(char), name_len, file);
fwrite(&students[i].age, sizeof(int), 1, file);
fwrite(&students[i].grade, sizeof(float), 1, file);
}
fclose(file);
for (int i = 0; i < n; ++i)
free(students[i].name);
free(students);
printf("Дані успішно записані у файл students.dat\n");
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment