Created
May 26, 2025 16:42
-
-
Save vlaleli/fbb14bf6b4face25e336130325fd6c8e to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #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