Ошибка при работе с файлами С++

Мне нужно подсчитать, сколько ребят получили неуд (хотя бы 1 двойку). Я создал второй файлик, как буфер обмена, туда я только оценки записываю. Однако не могу исправить ошибку - count выдает неверный ответ. То ли в цикле проблема, то ли в массиве или вообще при считывании. Помогите пожалуйста

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <Windows.h>
 
using namespace std;
struct Student
{
    char sname[20];
    char name[20];
    char mname[20];
    int math;
    int fiz;
    int cher;
    int him;
    int sopr;
}Man;
 
int main(void)
{
    setlocale(LC_ALL, "rus");
    int i, n;
    char str[15];
    int count = 0;
    cout << "Введите количество студентов => ";
    cin >> n;
    cout << "\n";
    ofstream file1("test1.txt");
    ofstream file2("test2.txt");
    for (i = 0; i < n; i++)
    {
        SetConsoleCP(1251);
        SetConsoleOutputCP(1251);
        cout << "Введите фамилию" << endl;
        scanf_s("\n");
        cin.getline(Man.sname, 20);
        cout << "Введите имя" << endl;
        cin.getline(Man.name, 20);
        cout << "Введите отчество" << endl;
        cin.getline(Man.mname, 20);
        cout << "Введите оценку по математике => ";
        cin >> Man.math;
        cout << "Введите оценку по физике => ";
        cin >> Man.fiz;
        cout << "Введите оценку по черчению => ";
        cin >> Man.cher;
        cout << "Введите оценку по химии => ";
        cin >> Man.him;
        cout << "Введите оценку по сопромату => ";
        cin >> Man.sopr;
 
        file1 << "ФИО:" << " ";
        file1 << Man.sname << " ";
        file1 << Man.name << " ";
        file1 << Man.mname << "\n";
        file1 << "Оценка по математике => ";
        file1 << Man.math << "\n";
        file1 << "Оценка по физике => ";
        file1 << Man.fiz << "\n";
        file1 << "Оценка по черчению => ";
        file1 << Man.cher << "\n";
        file1 << "Оценка по химии => ";
        file1 << Man.him << "\n";
        file1 << "Оценка по сопромату => ";
        file1 << Man.sopr << "\n";
        file2 << Man.math << " " << Man.fiz << " " << Man.cher << " " << Man.him << " " << Man.sopr << "\n";
        cout << "____________________________________________________________________" << endl;
        file1 << "--------------------------------------------------------------------" << "\n";
    }
    file1.close();
    file2.close();
 
    ifstream read("test2.txt");
    for (int z=0; z<n; z++)
    { 
        read.getline(str, 15);
        if (str[z] == '2')
            {
            count++;
            
            }break;
    }
    read.close();
 
    cout << "Количество студентов, получивших неуд => " << count << endl;
    if (count == 0)
        cout << "\n" << "Молодцы, экзамен сдали все! " << endl;
    return 0;
}

Ответы (2 шт):

Автор решения: Harry

Мало указанного KoVadim break, так у вас еще смотрите что делается:

for (int z=0; z<n; z++)   // n раз читаете строку
{ 
    read.getline(str, 15);
    if (str[z] == '2')   // Проверяте, стоит ли двойка именно на z-м месте!

Т.е. если у первого двойка не первая - вы ее не считаете

Двойки у второго вообще не будут проверены, так как вы проверяете для него только второй символ строки, а это пробел...

Для исправления я бы советовал обратить внимание на такую функцию, как strchr, которая ищет символ в строке.

→ Ссылка
Автор решения: Mikhailo

А почему бы вам не запоминать эту информацию в памяти при чтении с консоли?

Вместо

file2 << Man.math << " " << Man.fiz << " " << Man.cher << " " << Man.him << " " << Man.sopr << "\n";

написать

if (Man.math == 2|| Man.fiz==2 ||Man.cher==2 ||Man.him==2 || Man.sopr == 2) count++;

И не надо лишних медленных файловых операций.

→ Ссылка