Работа с текстовыми файлами с/с++ ,помогите пожалуйста
Дана целочисленная прямоугольная матрица. Определить количество отрицательных элементов
в тех строчках, которые содержат хотя бы один нулевой элемент; номера строк и столбцов всех
седловых точек матрицы.
План такой: С одного файла в другой записываю матрицу размером 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 шт):
Какие вы вводите значения 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.