Функция записи массива в бинарный файл

Здравствуйте, если кто найдет ошибку - поправьте, желательно кодом, если лень - то скажите в какой строке ошибка и самое главное - в чем. Функция считывает из файла матрицы, далее идет цикл по которому он считает сумму каждой из матриц, если данная сумма четная - он записывает матрицу в файл , а в заменяет данную матрицу - единичной матрицей. Ошибка ф-и в последнем этапе, а именно в записи. Сделал таким образом: проверяем сумму на четность, если четная - записываем в file2.txt ее и в file1.txt единичную матрицу, если проверка неудачна - просто записываем матрицу в file1.txt, которая была изначально и ничего не добавляем в file2.txt.
void func()
{
 
    ifstream readmas3("file1.txt", ios::binary);
    if (!readmas3)
    {
        cout << "Ошибка при открытии файла.\n";
    }
    else
    {
        int sum;
        int n = 0;
        int mass[k][k];
        system("cls");
        while (readmas3.read((char*)mass, sizeof(mass)))
        {
            
            sum = 0;
            n++;
            for (int i = 0; i < k; i++)
            {
                for (int j = 0; j < k; j++)
                {
                    cout << mass[i][j] << " ";
                    if ((mass[i][j] % 2 == 0)&&(mass[i][j]>0))
                    {
                        sum = sum + mass[i][j];
                    }
                }
                cout << endl;
            }
            cout << "Сумма матрицы #" << n << " равна - " << sum << "\n\n";
            remove("file1.txt");
            if (sum % 2 == 0)
            {
                ofstream writemas2("file2.txt", ios::binary | ios::app);
                if (!writemas2)
                {
                    cout << "Ошибка при открытии файла.\n";
                }
                else
                {
                    for (int i = 0; i < k; i++)
                    {
                        for (int j = 0; j < k; j++)
                        {
                            writemas2.write((char*)&mass[i][j], sizeof(int));
                        }
                    }
                }
                writemas2.close();
                ////////////////////
                ofstream writemas3("file1.txt", ios::binary | ios::app);
                if (!writemas3)
                {
                    cout << "Ошибка при открытии файла.\n";
                }
                else
                {
                    for (int i = 0; i < n; i++)
                    {
                        for (int j = 0; j < n; j++)
                        {
                            if (i == j)
                                mass[i][j] = 1;
                            else
                                mass[i][j] = 0;
                            writemas3.write((char*)&mass[i][j], sizeof(int));
                        }
                    }
                }
                writemas3.close();
            }
            else
            {
                ofstream writemas4("file1.txt", ios::binary | ios::app);
                if (!writemas4)
                {
                    cout << "Ошибка при открытии файла.\n";
                }
                else
                {
                    for (int i = 0; i < k; i++)
                    {
                        for (int j = 0; j < k; j++)
                        {
                            writemas4.write((char*)&mass[i][j], sizeof(int));
                        }
                    }
                    system("cls");
                }
                writemas4.close();
            }
        }
    }
    readmas3.close();
}
Ответившим - заранее спасибо!Сама ошибка - Stack around the variable 'mass' was corrupted.Полазил в коде - поисправлял, теперь проблемы в другом : он зацикливается на стадии записи и бесконечно записывает единичные матрицы и да, он не заменяет матрицы, сумма которых - четная, он записывает ее снова.
void func()
{
 
    ifstream readmas3("file1.txt", ios::binary);
    if (!readmas3)
    {
        cout << "Ошибка при открытии файла.\n";
    }
    else
    {
        int sum;
        int n = 0;
        int mass[k][k];
        system("cls");
        while (readmas3.read((char*)mass, sizeof(mass)))
        {
 
            sum = 0;
            n++;
            for (int i = 0; i < k; i++)
            {
                for (int j = 0; j < k; j++)
                {
                    cout << mass[i][j] << " ";
                    if ((mass[i][j] % 2 == 0) && (mass[i][j] > 0))
                    {
                        sum = sum + mass[i][j];
                    }
                }
                cout << endl;
            }
            cout << "Сумма матрицы #" << n << " равна - " << sum << "\n\n";
            remove("file1.txt");
            if (sum % 2 == 0)
            {
                ofstream writemas2("file2.txt", ios::binary | ios::app | ios::trunc);
                if (!writemas2)
                {
                    cout << "Ошибка при открытии файла.\n";
                }
                else
                {
                    for (int i = 0; i < k; i++)
                    {
                        for (int j = 0; j < k; j++)
                        {
                            writemas2.write((char*)&mass[i][j], sizeof(int));
                        }
                    }
                }
                writemas2.close();
                ////////////////////
                ofstream writemas3("file1.txt", ios::binary | ios::app);
                if (!writemas3)
                {
                    cout << "Ошибка при открытии файла.\n";
                }
                else
                {
                    for (int i = 0; i < k; i++)
                    {
                        for (int j = 0; j < k; j++)
                        {
                            if (i == j)
                            {
                                mass[i][j] = 1;
                            }
                            else
                            {
                                mass[i][j] = 0;
                            }
                        }
                    }
                    for (int i = 0; i < k; i++)
                    {
                        for (int j = 0; j < k; j++)
                        {
                            writemas3.write((char*)&mass[i][j], sizeof(int));
                        }
                    }
                    writemas3.close();
                }
 
            }
            else
            {
                ofstream writemas4("file1.txt", ios::binary | ios::app);
                if (!writemas4)
                {
                    cout << "Ошибка при открытии файла.\n";
                }
                else
                {
                    for (int i = 0; i < k; i++)
                    {
                        for (int j = 0; j < k; j++)
                        {
                            writemas4.write((char*)&mass[i][j], sizeof(int));
                        }
                    }
                    system("cls");
                }
                writemas4.close();
            }
        }
        readmas3.close();
    }
}
Еще нашел ошибки, но предыдущих не могу исправить :/ Вот окончательный вариант, ошибки: зацикливается и бесконечно записывает в файл file1.txt единичные матрицы, file2.txt даже не создает.. и да, матрицы не записывает, а просто добавляет сверху новые единичные матрицы
void func()
{
 
    ifstream readmas3("file1.txt", ios::binary);
    if (!readmas3)
    {
        cout << "Ошибка при открытии файла.\n";
    }
    else
    {
        int sum;
        int n = 0;
        int mass[k][k],
            mass1[k][k];
        system("cls");
        while (readmas3.read((char*)mass, sizeof(mass)))
        {
            sum = 0;
            n++;
            for (int i = 0; i < k; i++)
            {
                for (int j = 0; j < k; j++)
                {
                    cout << mass[i][j] << " ";
                    if (mass[i][j] > 0)
                    {
                        sum = sum + mass[i][j];
                    }
                }
                cout << endl;
            }
            cout << "Сумма матрицы #" << n << " равна - " << sum << "\n\n";
            if (sum % 2 == 0)
            {
                ofstream writemas2("file2.txt", ios::binary | ios::app | ios::trunc);
                if (!writemas2)
                {
                    cout << "Ошибка при открытии файла.\n";
                }
                else
                {
                    for (int i = 0; i < k; i++)
                    {
                        for (int j = 0; j < k; j++)
                        {
                            writemas2.write((char*)&mass[i][j], sizeof(int));
                        }
                    }
                }
                writemas2.close();
                ////////////////////
                ofstream writemas3("file1.txt", ios::binary | ios::app);
                if (!writemas3)
                {
                    cout << "Ошибка при открытии файла.\n";
                }
                else
                {
                    for (int i = 0; i < k; i++)
                    {
                        for (int j = 0; j < k; j++)
                        {
                            if (i == j)
                            {
                                mass1[i][j] = 1;
                            }
                            else
                            {
                                mass1[i][j] = 0;
                            }
                        }
                    }
                    for (int i = 0; i < k; i++)
                    {
                        for (int j = 0; j < k; j++)
                        {
                            writemas3.write((char*)&mass1[i][j], sizeof(int));
                        }
                    }
                    writemas3.close();
                }
 
            }
            else
            {
                ofstream writemas4("file1.txt", ios::binary | ios::app);
                if (!writemas4)
                {
                    cout << "Ошибка при открытии файла.\n";
                }
                else
                {
                    for (int i = 0; i < k; i++)
                    {
                        for (int j = 0; j < k; j++)
                        {
                            writemas4.write((char*)&mass[i][j], sizeof(int));
                        }
                    }
                    system("cls");
                }
                writemas4.close();
            }
        }
        readmas3.close();
    }
}
trbvncom
7 ответов

file1 откройте для записи. Он у вас открыт только для чтения. И если file1 не меняется - нет смысла его перезаписывать


file1 откройте для записи. Он у вас открыт только для чтения. И если file1 не меняется - нет смысла его перезаписывать
где конкретно открыть для записи? Он открывает тогда, когда надо и закрывается после того, как только он становится ненужным Номер строки подскажите, если не сложно, где именно ошибка


ifstream readmas3("file1.txt", ios::binary);


А перед какой строкой его вставить?
void func()
{
 
    ifstream readmas3("file1.txt", ios::binary);
    if (!readmas3)
    {
        cout << "Ошибка при открытии файла.\n";
    }
    else
    {
        int sum;
        int n = 0;
        int mass[k][k],
            mass1[k][k];
        system("cls");
        while (readmas3.read((char*)mass, sizeof(mass)))
        {
            sum = 0;
            n++;
            for (int i = 0; i < k; i++)
            {
                for (int j = 0; j < k; j++)
                {
                    cout << mass[i][j] << " ";
                    if (mass[i][j] > 0)
                    {
                        sum = sum + mass[i][j];
                    }
                }
                cout << endl;
            }
            cout << "Сумма матрицы #" << n << " равна - " << sum << "\n\n";
            if (sum % 2 == 0)
            {
                ofstream writemas2("file2.txt", ios::binary | ios::app | ios::trunc);
                if (!writemas2)
                {
                    cout << "Ошибка при открытии файла.\n";
                }
                else
                {
                    for (int i = 0; i < k; i++)
                    {
                        for (int j = 0; j < k; j++)
                        {
                            writemas2.write((char*)&mass[i][j], sizeof(int));
                        }
                    }
                }
                writemas2.close();
                ////////////////////
                ofstream writemas3("file1.txt", ios::binary | ios::app);
                if (!writemas3)
                {
                    cout << "Ошибка при открытии файла.\n";
                }
                else
                {
                    for (int i = 0; i < k; i++)
                    {
                        for (int j = 0; j < k; j++)
                        {
                            if (i == j)
                            {
                                mass1[i][j] = 1;
                            }
                            else
                            {
                                mass1[i][j] = 0;
                            }
                        }
                    }
                    for (int i = 0; i < k; i++)
                    {
                        for (int j = 0; j < k; j++)
                        {
                            writemas3.write((char*)&mass1[i][j], sizeof(int));
                        }
                    }
                    writemas3.close();
                }
 
            }
            else
            {
                ofstream writemas4("file1.txt", ios::binary | ios::app);
                if (!writemas4)
                {
                    cout << "Ошибка при открытии файла.\n";
                }
                else
                {
                    for (int i = 0; i < k; i++)
                    {
                        for (int j = 0; j < k; j++)
                        {
                            writemas4.write((char*)&mass[i][j], sizeof(int));
                        }
                    }
                    system("cls");
                }
                writemas4.close();
            }
        }
        readmas3.close();
    }
}
Я что-то совсем вас не понимаю, можете скинуть код, где уже вставлено и указать на эти строки?


c3490375, ifstream - для чтения, ofstream - для записи. Можете объединить все это в fstream
ofstream outFile; // Выходной файловый поток.
ifstream inFile; // Входной файловый поток.
fstream ioFile; // Файловый поток для ввода и вывода.


c3490375, ifstream - для чтения, ofstream - для записи. Можете объединить все это в fstream
Это я знаю, но где я конкретно ошибся то? Функция же идет верно:
Открываем (file1.txt для чтения) - readmas3
(пока файл читается (filemas3))
{
  ищем сумму матрицы
  сверяем сумму
  {
  если она четная - 
  {
  открываем для записи writemas2 в файл file2.txt, далее закрываем writemas2 // сюда записываем матрицу
  открываем для записи writemas3 в файл file1.txt, далее закрываем writemas3 // тут записывается единичная 
//матрица взамен на изначальную
  }
  если сумма нечетная
  {
  открываем для записи writemas4 в файл file1.txt и записываем только изначальную матрицу в файл file1.txt, при этом file2.txt - не трогаем.
  }
закрываем readmas3
}
*************


У тебя один и тот же файл file1 открыт и для чтения, и для записи разными потоками.