Работа с текстовыми файлами с/с++ ,помогите пожалуйста

Дана целочисленная прямоугольная матрица. Определить количество отрицательных элементов в тех строчках, которые содержат хотя бы один нулевой элемент; номера строк и столбцов всех седловых точек матрицы. План такой: С одного файла в другой записываю матрицу размером N на M и следую заданию. В текстовый документ должен записать - "количество отрицательных элементов в тех строчках, которые содержат хотя бы один нулевой элемент; номера строк и столбцов всех седловых точек матрицы." Эти задачи я уже решил,осталось записать ответ в текстовый док. Помогите разобраться с ошибкой,а то я уже несколько часов голову ломаю.Возможно ответ на вопрос будет очевидным,но я только учусь... Вот сама ошибка: введите сюда описание изображения

Код:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <time.h>
using namespace std;
/*Дана цілочисельна прямокутна матриця. Визначити кількість від’ємних елементів
в тих рядках, які містять хоча б один нульовий елемент; номери рядків і стовпців всіх
сідлових точок матриці.*/

int main()
{
    setlocale(LC_ALL ,"ru");
    srand(time(NULL));

    FILE* fin(NULL);
    char namef[40];
    puts("Введите название файла: \n");
    fgets(namef, 99, stdin);
    char* p = strchr(namef, '\n'); 
    if (p) *p = '\0';
    fin = fopen(namef, "r");
    if (!fin)
    {
        printf("Не могу открыть файл\n");
        return 1;
    }
    int n, m;
    fscanf(fin, "%d%d", &n, &m);
    int** mas = new int* [n];
    for (int i = 0; i < n; i++)
        mas[i] = new int[m];

    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            fscanf(fin, "%d", &mas[i][j]);
    fclose(fin);

    
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            printf("%5d", mas[i][j]);
        }
        printf("%c", '\n');
    }
    
    FILE* fout = fopen("output.txt", "w");
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
            fprintf(fout, "%5d", mas[i][j]);

        fprintf(fout, "%c", '\n');
    }
    fclose(fout);
    fout = fopen("f3.b", "wb");
    
    for (int i = 0; i < n; i++)
    {
        fwrite(mas[i], sizeof(int) * m, 1, fout);
    }
    fclose(fout);
    int** mas2 = new int* [n];
    for (int i = 0; i < n; i++)
    {
        mas2[i] = new int[m];
    }
    fin = fopen("f3.b", "rb");
    
    for (int i = 0; i < n; i++)
    {
        fread(mas2[i], sizeof(int) * m, 1, fin);
    }
    printf("%c", '\n');

    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            printf("%5d", mas2[i][j]);
        }
        printf("%c", '\n');
    }
    
    
    int  x, y;
    for (int i = 0; i < n; i++)
    {
        x = 0;
        for (int j = 0; j < m; j++)
        {
            if (mas[i][j] == 0)
                x++;
        }
        if (x)
        {
            y = 0;
            for (int j = 0; j < m; j++)
            {
                if (mas[i][j] < 0)
                    y++;
            }
            if (y)
            {
                fout = fopen("output.txt", "a+");
                printf("Рядок с нулевым элементом под номером %d содержит отрицательных элементов: %d\n" ,i+1, y);
                fprintf(fout,"Рядок с нулевым элементом под номером %d содержит отрицательных элементов: %d\n", i + 1, y);
            }
        }
    }
    fclose(fout);
    
    int i, j, val;
    const int N = 3, M = 4;
    int min_h[N], max_w[M];
    for (i = 0; i < N; i++) 
    {
        val = mas[i][0];
        for (j = 1; j < M; j++) 
        {
            if (mas[i][j] < val) val = mas[i][j]; 
        }
        min_h[i] = val;
    }

    for (j = 0; j < N; j++) 
    {
        val = mas[0][j];
        for (i = 1; i < N; i++) 
        {
            if (mas[i][j] > val)  val = mas[i][j]; 
        }
        max_w[j] = val;
    }

    for (i = 0; i < m; i++) {
        for (j = 0; j < n; j++) {
            if (mas[i][j] == max_w[j] && mas[i][j] == min_h[i]) 
            {
                fout = fopen("output.txt", "a+");
                printf("Номер седловой точки: [%d][%d]\nСедловая точка: %d\n", i, j, mas[i][j]);
                fprintf(fout,"Номер седловой точки: [%d][%d]\nСедловая точка: %d\n", i, j, mas[i][j]);
            }
        }
    }
    fclose(fout);
    
    for (int i = 0; i < n; i++)
    {
        delete[]mas[i];
        delete[]mas2[i];
    }
    delete[]mas;
    delete[]mas2;
    puts("\nКонец\n");
    system("pause");
    return 0;
}

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

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

Какие вы вводите значения n и m?

Потому что массивы min_h и max_w у вас имеют очень конкретный размеры:

const int N = 3, M = 4;
int min_h[N], max_w[M];

И если m и n больше этих размеров, то вот тут

for (i = 0; i < m; i++) {
    for (j = 0; j < n; j++) {
        if (mas[i][j] == max_w[j] && mas[i][j] == min_h[i])

вы просто выходите за границы массивов. Со всеми вытекающими неопределенно-поведенческими последствиями...

Да и всегда у вас в mas было n строк и m столбцов, а тут почему-то вы их поменяли местами, и по строкам идете до m, а по столбцам — до n.

→ Ссылка