1

Тема: Файли

Доброго вечора!
Написала програму, яка реалізує наступне завдання:
"Вхідні дані (поля структури) вводяться з клавіатури і після введення записуються у файл (окрема функція); програма має можливість дописувати дані у файл (окрема функція); дані з файлу виводяться на екран (окрема функція)"
Проблема в тому, що файл то створюється, але в нього нічого не записується (навіть перше повідомлення). Не можу знайти тут помилку. Буду вдячна за допомогу)

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <stdio.h>    
#define MAX 50
using namespace std;
struct SCHL
{
    char NAME[30];
    char GROUP[10];
    int SUBJ[5];
};
void input(SCHL LEARN[], int N, FILE* students)
{
    for (int i = 0; i < N; i++)
    {
        printf("Enter the student's surname: ");
        scanf_s("%s", &LEARN[i].NAME);
        printf("Enter the name of the group in which the student is studying: ");
        scanf_s("%s", &LEARN[i].GROUP);
        fprintf(students, "%s %s ", LEARN[i].NAME, LEARN[i].GROUP);
        printf("Enter 5 grades from the subjects (Mathematics, Informatics, Programming, Graphics, Foreign): ");
        for (int j = 0; j < 5; j++)
        {
            scanf_s("%i", &LEARN[i].SUBJ[j]);
            fprintf(students, "%i ", LEARN[i].SUBJ[j]);
        }
        printf("\n");
    }
}
void condition(SCHL LEARN[], int N, FILE* students)
{
    int k = 0;
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < 5; j++)
        {
            if (LEARN[i].SUBJ[j] == 2)
            {
                printf("%s\t\t%s\n", LEARN[i].NAME, LEARN[i].GROUP);
                fprintf(students, "\n%s %s\n", LEARN[i].NAME, LEARN[i].GROUP);
                k++;
                break;
            }
        }
    }
    if (k == 0)
    {
        printf("The entered students have no negative marks!\n");
        fprintf(students, "\nThe entered students have no negative marks!\n");
    }
}
void pluss(SCHL LEARN[], int x, FILE* students)
{

    switch (x)
    {
    case 1:
        int n;
        printf("Please enter the number of students whose data will be entered later : ");
        scanf_s("%i", &n);
        for (int i = 0; i < n; i++)
        {
                        printf("Enter the student's surname: ");
                scanf_s("%s", &LEARN[i].NAME);
                printf("Enter the name of the group in which the student is studying: ");
                scanf_s("%s", &LEARN[i].GROUP);
                fprintf(students, "%s %s ", LEARN[i].NAME, LEARN[i].GROUP);
                printf("Enter 5 grades from the subjects (Mathematics, Informatics, Programming, Graphics, Foreign): ");
                for (int j = 0; j < 5; j++)
                {
                   scanf_s("%i", &LEARN[i].SUBJ[j]);
                   fprintf(students, "%i ", LEARN[i].SUBJ[j]);
                 }
                printf("\n");
            }
        break;
    default:
        printf("Completion..\n");
        fprintf(students, "Completion...\n");
        break;
    }
}
void output(SCHL LEARN[], FILE* students)
{
    for (int i= 0; i < !feof(students); i++)
    {
        for (int j = 0; j < 5; j++)
        {
            fscanf(students, "%s %s %i", &LEARN[i].NAME, &LEARN[i].GROUP, &LEARN[i].SUBJ[j]);
            printf("%s %s %i", LEARN[i].NAME, LEARN[i].GROUP, LEARN[i].SUBJ[j]);
        }
        printf("\n");
    }
}
int main()
{
    int N, x;
    SCHL LEARN[MAX];
    FILE* students;
    students = fopen("students_info.txt", "w+");
    fprintf(students, "You start filling in the table!\n");
    printf("You start filling in the table!\nPlease enter the number of students whose data will be entered later: ");
    scanf_s("%i", &N);
    input(LEARN, N, students);
    printf("Students with negative grades:\n");
    condition(LEARN, N, students);
    printf("Program menu:\n1) Add several new entries;\n0) Finish the job.\n");
    do
    {
        printf("\nEnter the menu item: ");
        scanf_s("%d", &x);
        pluss(LEARN, x, students);
    } while (x != 0);
    printf("Output data from the file to the screen:\n");
    output(LEARN, students);
    fclose(students);
    system("pause");
    return 0;
}

2

Re: Файли

Не гасіть попередження компілятора, якщо точно не певні, що вам їх треба гасити. Виправляйте. Ви тут користуєтеся scanf_s - то ви певні, що вам потрібен _CRT_SECURE_NO_WARNINGS? А інших попереджень компілятор не видає?

Стосовно проблеми.
Файлові об'єкти в C, насправді, імітують касети (точніше, абстрактні файлові потоки враховують можливість того, що це буде касета). Бачили такі носії? Їм, перед тим, як читати або писати, треба перекрутитися на потрібне місце. Це викликає деякі цікаві ефекти. Загалом я б радив початківцям не читати і писати одночасно з одного файлу, а закривати його між операціями. Утім, можете і так робити, але тоді перед переходом на читання примусово записуйте дані функцією fflush, бо інакше файл "перемотується" без запису.

В цілому ж функція output робить щось незрозуміле: наприклад, функція feof повертає 0, якщо остання операція читання завершилася всередині файлу, і 1, якщо її було перервано через досягнення кінця файлу. Відповідно, !feof(students) набуває значення 0 після кінця файлу, і 1 до того. Зовнішній цикл, схоже, робить не те, що ви хотіли.

Подякували: leofun011

3

Re: Файли

koala написав:

Не гасіть попередження компілятора, якщо точно не певні, що вам їх треба гасити. Виправляйте. Ви тут користуєтеся scanf_s - то ви певні, що вам потрібен _CRT_SECURE_NO_WARNINGS? А інших попереджень компілятор не видає?

Ні, інших попереджень немає, а без _CRT_SECURE_NO_WARNINGS не йде навіть при використанні scanf_s.
Начебто зрозуміла, що ви маєте на увазі щодо проблеми. Дякую, намагатимусь усунути..

4

Re: Файли

Я б почав з уточнення, яка мова використовувалась при написанні? С чи С++?

Подякували: koala1

5

Re: Файли

Akos_Bond написав:
koala написав:

Не гасіть попередження компілятора, якщо точно не певні, що вам їх треба гасити. Виправляйте. Ви тут користуєтеся scanf_s - то ви певні, що вам потрібен _CRT_SECURE_NO_WARNINGS? А інших попереджень компілятор не видає?

Ні, інших попереджень немає, а без _CRT_SECURE_NO_WARNINGS не йде навіть при використанні scanf_s.
Начебто зрозуміла, що ви маєте на увазі щодо проблеми. Дякую, намагатимусь усунути..

Виключати попередження компілятора - злочин, та ще й таким варварським способом.
І, що означає не йде? А що, кудись таки мав?

6

Re: Файли

wander написав:

Я б почав з уточнення, яка мова використовувалась при написанні? С чи С++?

Оскільки в лекціях С, а в прикладах в більшості випадків використовується С++, писала на С++, користуючись функціями із С. Проте намагаюсь писати лише на якійсь одній мові. Знаю, що використовувати обидві дуже погано.

wander написав:

Виключати попередження компілятора - злочин, та ще й таким варварським способом.
І, що означає не йде? А що, кудись таки мав?

Щодо цього взагалі нічого не читала. Мала на увазі, що без цього програма не йде на відладку. Якщо є попередження, то ті, що стосуються функції fopen, тому користуюсь у випадку з файлами _CRT_SECURE_NO_WARNINGS.