Как вывести в Txt файл двумерный массив в с++?

227
28 января 2018, 02:56

Добрый вечер, я разобрался с некоторыми проблемами, но теперь у меня другой вопрос: есть такой код расчета температуры:

int x, y, z;
double cx, Tn1, Tn2, Tn3, Tn4, k, r23, r24, bb3, f, h0, f2, f3, f4, f5, f6, f7, fpad2, ktwo, s, Tn5, Tn6;
ifstream fin1("pov20.txt");
ifstream fin2("nak20.txt");
ifstream fin3("h20.txt");
FILE *ff = fopen("res1.txt", "w+");
for (int i = 0;i<Lan;i++) {
    for (int j = 0;j<Lan;j++) {
        fin1 >> pov[i][j];
        fin2 >> nak[i][j];
        fin3 >> h[i][j];
    }
}
for (T = 1;T<v;T++) {
    for (z = 1;z<Lanz;z++) {
        for (y = 1;y<Lan;y++) {
            for (x = 1;x<Lan;x++) {
                if (T ==1) {
                    if (y<25) {
                        Tnach[x][y][z] = 100;
                    }
                    else
                        Tnach[x][y][z] = 100;
                }
                else Tnach[x][y][z] = Tempernach[x][y][z];
            }
        }
    }
    q0 = 6.67*(10 ^ (-23));
    r22 = R0 / A1;
    r23 = log(r22);
    r24 = exp(r23 * 2);
    T01 = log(T0);
    T02 = exp(T01 * 4);
    F0 = r24 * T02;
    s = 5.67*(10 ^ (-8));
    Tim = 29.5 * 24 * 60 * 60;
    a = e * s;
    for (z = 1;z<Lanz;z++) {
        d = z * deltaz;
        for (y = 1;y<Lan;y++) {
            for (x = 1;x<Lan;x++) {
                Tem11=Tnach[x][y][z];
                Tem = (Tem11 - 300) / 300;
                Tum = log(Tem);
                Tem1 = exp(Tum * 2);
                Tem2 = exp(Tum * 3);
                Tem3 = exp(Tum * 4);
                ccx1 = cc1 + (cc2*Tem) + (cc3*Tem1) + (cc4*Tem2) + (cc5*Tem3);
                cx = ccx1 * 4186.8;
                ro = ro2 - ((ro2 - ro1)*exp(-d / 0.06));
                Tn1 = log(Tem11 / 350);
                Tn2 = exp(Tn1 * 3);
                k = kd - ((kd - ks)*exp(-d / 0.06)) + (ksi*ks*Tn2);
                if (d <= 0.02) {
                    ktwo = k1 * (1 + (ksi1*Tn2)) / (ro1*cx);
                    k11 = k1 * (ksi1*Tn2);
                    ro = ro1;
                    kvak = k11;
                }
                else {
                    ktwo = k2 * (1 + (ksi2*Tn2)) / (ro2*cx);
                    k22 = k2 * (ksi2*Tn2);
                    ro = ro2;
                    kvak = k22;
                }
                k = ktwo;
                tau01 = log(deltaz);
                tau02 = exp(tau01 * 2);
                tau1 = tau02 / (2 * k);
                if (x = 1) {
                    f2 = 0;
                    f3 = k * deltat*(Tnach[x + 1][y][z] - Tnach[x][y][z]) / (deltaz*deltay);
                }
                else {
                    if (x == Lan-1) {
                        f3 = 0;
                        f2 = k * deltat*(Tnach[x - 1][y][z] - Tnach[x][y][z]) / (deltaz*deltay);
                    }
                    else
                        f3 = k * deltat*(Tnach[x + 1][y][z] - Tnach[x][y][z]) / (deltaz*deltay);
                    f2 = k * deltat*(Tnach[x - 1][y][z] - Tnach[x][y][z]) / (deltaz*deltay);
                }
                if (y == 1) {
                    f5 = 0;
                    f4 = k * deltat*(Tnach[x][y + 1][z] - Tnach[x][y][z]) / (deltaz*deltax);
                }
                else {
                    if (y == Lan-1) {
                        f4 = 0;
                        f5 = k * deltat*(Tnach[x][y - 1][z] - Tnach[x][y][z]) / (deltaz*deltax);
                    }
                    else
                        f4 = k * deltat*(Tnach[x][y + 1][z] - Tnach[x][y][z]) / (deltaz*deltax);
                    f5 = k * deltat*(Tnach[x][y - 1][z] - Tnach[x][y][z]) / (deltaz*deltax);
                }
                if (z == 1) {
                    h0 = 90 - fi;
                    Az = 359;
                    Tn5 = log(Tnach[x][y][z]);
                    Tn6 = exp(Tn5 * 4);
                    f6 = (1 - albedo)*F0*s*((sin(h0*Pi / 180)*cos(nak[x][y])*Pi / 180)) - (cos(h0*Pi / 180)*sin(nak[x][y] * Pi / 180)*cos((pov[x][y] - Az)*Pi / 180)) - (e*s*Tn6);
                    f7 = k * deltat*(Tnach[x][y][z + 1] - Tnach[x][y][z]) / (deltax*deltay);
                }
                else {
                    if (z == Lanz-1) {
                        f7 = 0;
                        f6 = k * deltat*(Tnach[x][y][z - 1] - Tnach[x][y][z]) / (deltax*deltay);
                    }
                    else
                        f7 = k * deltat*(Tnach[x][y][z + 1] - Tnach[x][y][z]) / (deltax*deltay);
                    f6 = k * deltat*(Tnach[x][y][z - 1] - Tnach[x][y][z]) / (deltax*deltay);
                }
                if (f6<0) {
                    f6 = 0;
                }
                fpad2 = f2 + f3 + f4 + f5 + f6 + f7;
                Tn3 = log(Tnach[x][y][z]);
                Tn4 = exp(Tn3 * 4);
                f = (s*Tn4) + fpad2;
                Tb1 = f / s;
                Tb2 = log(Tb1);
                Tb3 = exp(Tb2*0.25);
                Temper[x][y][z] = Tb3;
                bb3 = Temper[x][y][z];
                Tut[x][y] = Temper[x][y][1];
                Tut11[x][y] = Temper[x][y][2];
                Tut22[x][y] = Temper[x][y][3];
                Tut1[x][z] = Temper[x][10][z];
                Tempernach[x][y][z] = Temper[x][y][z];
            }
        }
    }
    Tempernach[x][y][z] = Temper[x][y][z];
    Tim2 = Tim2 + deltat;
}
Temper1[x][y][z] = Temper[x][y][z];
fprintf(ff, "%d", Tut1[x][y]);

}

Мне нужно вывести массив Tut1 в файл txt. Это срез распространения температуры в некоем объеме. Я сделал пересборку и получил в окне Вывод - Сборка смледующий текст:

1>------ Перестроение всех файлов начато: проект: Project1, Конфигурация: Debug Win32 ------ 1>Source.cpp 1>c:\users\л\source\repos\project1\project1\source.cpp(66): error C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 1>c:\program files (x86)\windows kits\10\include\10.0.16299.0\ucrt\stdio.h(207): note: см. объявление "fopen" 1>c:\users\л\source\repos\project1\project1\source.cpp(209): warning C4477: "fprintf": в строке форматирования "%d" требуется аргумент типа "int", но вариативный аргумент "1" имеет тип "double" 1>Сборка проекта "Project1.vcxproj" завершена с ошибкой. ========== Перестроение всех проектов: успешно: 0, с ошибками: 1, пропущено: 0 ==========

Скажите пожалуйста, что не так? Что ему не нравится?

Спасибо, кое-что изменилось:

#include <iostream>
#include <stdio.h>
#include <fstream>
#include <math.h>
#include <cmath>
#include <conio.h> 
using namespace std;
double Tnach[139][139][50];
double Temper[139][139][50];
double Temper1[139][139][50];
double Tempernach[139][139][50];
double Tut[139][139];
double Tut1[139][139];
double Tut11[139][139];
double Tut22[139][139];
#define _CRT_SECURE_NO_WARNINGS
int main() {
const int i = 0;
const int w = 20;
const int fi = 73;
double albedo = 0.11;
double I0 = 1.538889;
double R0 = 695510;
const double T0 = 5778;
double A1 = 147800000;
double e = 0.95;
const int v = 100;
double Az = 360;
int Lan = 139;
int Lanz = 50;
double pov[139][139];
double nak[139][139];
double h[139][139];
double l1 = 0.02;
double Fn = 0.02;
double Pi = 3.1415;
double ro1 = 1300;
double ro2 = 1800;
double cc1 = 0.1812;
double cc2 = 0.1191;
double cc3 = 0.0176;
double cc4 = 0.2721;
double cc5 = 0.1869;
double k1 = 0.000922;
double k2 = 0.0093;
double ks = 0.0006;
double kd = 0.007;
double ksi1 = 1.48;
double ksi2 = 0.073;
double Tim2 = 0;
double ksi = 2.7;
double ccx1;
double Tum, tau01, tau02, tau1, r22, ro, k11, k22, Tem, Tem11, Tem1, Tem2, Tem3, d, kvak, q0, F0, Tim, a, Tb1, Tb2, Tb3, T, T01, T02;
double deltaz = 0.002;
double deltay = 0.002;
double deltax = 0.002;
double deltat = 0.000429;
int x, y, z;
double cx, Tn1, Tn2, Tn3, Tn4, k, r23, r24, bb3, f, h0, f2, f3, f4, f5, f6, f7, fpad2, ktwo, s, Tn5, Tn6;
ifstream fin1("pov20.txt");
ifstream fin2("nak20.txt");
ifstream fin3("h20.txt");
FILE *ff = fopen("res1.txt", "w+");
for (int i = 0;i<Lan;i++) {
    for (int j = 0;j<Lan;j++) {
        fin1 >> pov[i][j];
        fin2 >> nak[i][j];
        fin3 >> h[i][j];
    }
}
for (T = 1;T<v;T++) {
    for (z = 1;z<Lanz;z++) {
        for (y = 1;y<Lan;y++) {
            for (x = 1;x<Lan;x++) {
                if (T ==1) {
                    if (y<25) {
                        Tnach[x][y][z] = 100;
                    }
                    else
                        Tnach[x][y][z] = 100;
                }
                else Tnach[x][y][z] = Tempernach[x][y][z];
            }
        }
    }
    q0 = 6.67*(10 ^ (-23));
    r22 = R0 / A1;
    r23 = log(r22);
    r24 = exp(r23 * 2);
    T01 = log(T0);
    T02 = exp(T01 * 4);
    F0 = r24 * T02;
    s = 5.67*(10 ^ (-8));
    Tim = 29.5 * 24 * 60 * 60;
    a = e * s;
    for (z = 1;z<Lanz;z++) {
        d = z * deltaz;
        for (y = 1;y<Lan;y++) {
            for (x = 1;x<Lan;x++) {
                Tem11=Tnach[x][y][z];
                Tem = (Tem11 - 300) / 300;
                Tum = log(Tem);
                Tem1 = exp(Tum * 2);
                Tem2 = exp(Tum * 3);
                Tem3 = exp(Tum * 4);
                ccx1 = cc1 + (cc2*Tem) + (cc3*Tem1) + (cc4*Tem2) + (cc5*Tem3);
                cx = ccx1 * 4186.8;
                ro = ro2 - ((ro2 - ro1)*exp(-d / 0.06));
                Tn1 = log(Tem11 / 350);
                Tn2 = exp(Tn1 * 3);
                k = kd - ((kd - ks)*exp(-d / 0.06)) + (ksi*ks*Tn2);
                if (d <= 0.02) {
                    ktwo = k1 * (1 + (ksi1*Tn2)) / (ro1*cx);
                    k11 = k1 * (ksi1*Tn2);
                    ro = ro1;
                    kvak = k11;
                }
                else {
                    ktwo = k2 * (1 + (ksi2*Tn2)) / (ro2*cx);
                    k22 = k2 * (ksi2*Tn2);
                    ro = ro2;
                    kvak = k22;
                }
                k = ktwo;
                tau01 = log(deltaz);
                tau02 = exp(tau01 * 2);
                tau1 = tau02 / (2 * k);
                if (x = 1) {
                    f2 = 0;
                    f3 = k * deltat*(Tnach[x + 1][y][z] - Tnach[x][y][z]) / (deltaz*deltay);
                }
                else {
                    if (x == Lan-1) {
                        f3 = 0;
                        f2 = k * deltat*(Tnach[x - 1][y][z] - Tnach[x][y][z]) / (deltaz*deltay);
                    }
                    else
                        f3 = k * deltat*(Tnach[x + 1][y][z] - Tnach[x][y][z]) / (deltaz*deltay);
                    f2 = k * deltat*(Tnach[x - 1][y][z] - Tnach[x][y][z]) / (deltaz*deltay);
                }
                if (y == 1) {
                    f5 = 0;
                    f4 = k * deltat*(Tnach[x][y + 1][z] - Tnach[x][y][z]) / (deltaz*deltax);
                }
                else {
                    if (y == Lan-1) {
                        f4 = 0;
                        f5 = k * deltat*(Tnach[x][y - 1][z] - Tnach[x][y][z]) / (deltaz*deltax);
                    }
                    else
                        f4 = k * deltat*(Tnach[x][y + 1][z] - Tnach[x][y][z]) / (deltaz*deltax);
                    f5 = k * deltat*(Tnach[x][y - 1][z] - Tnach[x][y][z]) / (deltaz*deltax);
                }
                if (z == 1) {
                    h0 = 90 - fi;
                    Az = 359;
                    Tn5 = log(Tnach[x][y][z]);
                    Tn6 = exp(Tn5 * 4);
                    f6 = (1 - albedo)*F0*s*((sin(h0*Pi / 180)*cos(nak[x][y])*Pi / 180)) - (cos(h0*Pi / 180)*sin(nak[x][y] * Pi / 180)*cos((pov[x][y] - Az)*Pi / 180)) - (e*s*Tn6);
                    f7 = k * deltat*(Tnach[x][y][z + 1] - Tnach[x][y][z]) / (deltax*deltay);
                }
                else {
                    if (z == Lanz-1) {
                        f7 = 0;
                        f6 = k * deltat*(Tnach[x][y][z - 1] - Tnach[x][y][z]) / (deltax*deltay);
                    }
                    else
                        f7 = k * deltat*(Tnach[x][y][z + 1] - Tnach[x][y][z]) / (deltax*deltay);
                    f6 = k * deltat*(Tnach[x][y][z - 1] - Tnach[x][y][z]) / (deltax*deltay);
                }
                if (f6<0) {
                    f6 = 0;
                }
                fpad2 = f2 + f3 + f4 + f5 + f6 + f7;
                Tn3 = log(Tnach[x][y][z]);
                Tn4 = exp(Tn3 * 4);
                f = (s*Tn4) + fpad2;
                Tb1 = f / s;
                Tb2 = log(Tb1);
                Tb3 = exp(Tb2*0.25);
                Temper[x][y][z] = Tb3;
                bb3 = Temper[x][y][z];
                Tut[x][y] = Temper[x][y][1];
                Tut11[x][y] = Temper[x][y][2];
                Tut22[x][y] = Temper[x][y][3];
                Tut1[x][z] = Temper[x][10][z];
                Tempernach[x][y][z] = Temper[x][y][z];
            }
        }
    }
    Tempernach[x][y][z] = Temper[x][y][z];
    Tim2 = Tim2 + deltat;
}
Temper1[x][y][z] = Temper[x][y][z];
fprintf(ff, "%lf", Tut1[x][y]);

}

Но попрежнему он выдает:

1>------ Сборка начата: проект: Project1, Конфигурация: Debug Win32 ------ 1>Source.cpp 1>c:\users\л\source\repos\project1\project1\source.cpp(67): error C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 1>c:\program files (x86)\windows kits\10\include\10.0.16299.0\ucrt\stdio.h(207): note: см. объявление "fopen" 1>Сборка проекта "Project1.vcxproj" завершена с ошибкой. ========== Сборка: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ========== В графе Проект - С/С+ - Общие не было строки "Обрабатывать исключения как ошибки" , там было "Обрабатывать предупреждения как ошибки" и было выставлено Нет. При нажатии Отладка - Начать отладку он говорит что проект устарел и нужно ли сделать его сборку? Я отвечаю ему что Да и дальше он выкидывает окно, что Возникли ошибки сборки и Нужно ли запустить последнюю удачную сборку? Я отвечаю что Да и он выкидывает окно, что путь к Project.exe не найден. Как с этим быть?

Answer 1

C4996 это на самом деле предупреждение а не ошибка, нужно либо последовать совету и использовать fopen_s либо выставить в настройках проект не обрабатывать исключения как ошибки (С++ -> Общие -> Обрабатывать исключения как обшибки)

Answer 2

Ему не нравятся две вещи.

  1. Вы используете функцию fopen, которую он считает небезопасной. Но тут же показывает, как ему заткнуть рот :) - или используйте fopen_s, или первой же строкой поставьте

    #define _CRT_SECURE_NO_WARNINGS

  2. Вы используете для вывода %d, но этот спецификатор - для вывода целых чисел (тип int). Вы хотите выводить double - а тут надо использовать %lf или там %le - в зависимости, как вы хотите выводить...

А вообще, раз вы работаете в C++ - используйте потоки (ofstream).

Answer 3

Спасибо всем за ответы. изменил открытие файла на след вид и вопросов у программы больше нет.

FILE *ff; fopen_s(&ff,"res1.txt", "w");

Теперь осталось убедиться что она считает то что мне нужно.

READ ALSO
c++ class winforms

c++ class winforms

В переменной класса тип std::string, а в текста textBox`a System::String

227
Qt смена шрифта

Qt смена шрифта

Программирую софт на OpenSuse с фиксированым шрифтомПри запуске софта на другом дистрибутиве, к примеру на Ubuntu, выстовляется другой шрифт

263
отрицательное число в индексах

отрицательное число в индексах

Oбычно в индексах массивов, контейнеров используется беззнаковое числоК тому же unsigned(-1) компилятором преобразовывается на большое положительное...

253