Не записывает в файл , выбрасывает с сообщением buffer!=nullptr - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Добрый день, добрые люди, не могу вывести в файл символы значений поля игры крестики-нолики, выбрасывает на этапе записи с сообщением buffer!=nullptr .может кто-то по коду подскажет, что я неправильно сделала))) еще не могу сообразить,как задать цвет крестикам и ноликам с сохранением цвета самого поля.
#include <iostream>
#include <windows.h> 
#include <iomanip>
#include<stdlib.h>
#include <conio.h>
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <clocale>
#include<time.h>
#include <ctime>
#include <Windows.h>

using namespace std;

#define SPACE ' '
char matrix[3][3] = { /* матрица для крестиков-ноликов */
    { SPACE, SPACE, SPACE },
    { SPACE, SPACE, SPACE },
    { SPACE, SPACE, SPACE }
};

enum ConsoleColor
{
    Black = 0,
    DarkBlue = 1,
    Green = 2,
    Blue = 3,
    Red = 4,
    Magenta = 5,
    Yellow = 6,
    White = 7,
    Gray = 8,
    LightBlue = 9,
    LightGreen = 10,
    LightMagenta = 11,
    LightRed = 12,
    Cyan = 13,
    LightYellow = 14,
    LightWhite = 15
 
};

void SetColor(int text, int background)
{
    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(hStdOut, (WORD)((background << 4) | text));
}

void get_computer_move(void);
void get_player_move(void);
void disp_matrix(void);
char check(void);
void renew();
//void zapis_disp();
void main()
{
 
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    setlocale(LC_ALL, "Russian");
    srand(time(NULL));

    int z;
 
    printf("\n 1-Сыграть в "крестики-нолики" \n");
    printf("\n 2-Выйти из игры \n");
    cin >> z;
    while (z != 2)
    {
        char done;
        printf("\n______________________Играем в "крестики-нолики"_______________________\n");
        printf("\n_____________Вы играете против искусственного интеллекта_________________\n");
        done = SPACE;
 
        do {
 
            disp_matrix(); /* вывод игровой доски */
            get_player_move(); /* ходит игрок */
            printf("Вы походили! \n");
            disp_matrix(); /* вывод игровой доски */
            Sleep(1000);
            done = check(); /* проверка на победу */
            if (done != SPACE) break; /* победитель */
            printf("Компьютер ходит! \n");
            Sleep(300);
            get_computer_move(); /* ходит компьютер */
            system("cls");
            done = check(); /* проверка на победу */
        } while (done == SPACE);
        if (done == 'X') printf("    Поздравляем!Вы выиграли!     \n");
        else printf("       Выиграл компьютер!!!!     \n");
        //disp_matrix(); /* отображение результирующего положения */
        Sleep(3000);
 
        FILE* fp;
        fp = fopen("tabl.txt", "a");
        if (fp != NULL)
            for (int i = 0; i < 9; i++)
            {
                for (int j = 0; j < 9; j++)
                {
                    fscanf(fp, "%c", matrix[i][j]);
                }
            }
        else printf("Невозможно открыть файл на запись.\n");
        fclose(fp);
        cout << "\n Состояние поля успешно добавлено в файл: tabl.txt  \n" << endl;
        /*if (fp != NULL)
        {
        cout << "Вы добавили состояние поля    \n\n";
        for (int i = 0; i < 9; i++)
        {
        for (int j = 0; j < 9; j++)
        {
        fprintf(fp, "%c", matrix[i][j]);
        }
        }

        }
        fclose(fp);
        */
 
        system("cls");
        renew();
        printf("\n 1-Cыграть в "крестики-нолики" \n");
        printf("\n 2-Выйти из игры \n");
        cin >> z;
        system("cls");
    }

    exit(0);
}
 
/* ввод хода игрока */
void get_player_move(void)
{
    int y;
    int x;
    printf("Введите координаты вашего  X.\n");
    printf("Номер строки? ");
    scanf("%d", &x);
    printf("Номер столбца? ");
    scanf("%d", &y);
    x--; y--;
 
    if (x < 0 || y < 0 || x>2 || y>2 || matrix[x][y] != SPACE)
    {
        printf("Измените координаты, вы вышли за границы поля.\n");
        get_player_move();
    }
 
    else SetColor(13, 10); {  matrix[x][y] = 'X'; }
}
 
/* ход компьютера */
void get_computer_move(void)
{
    int t;
    char *p;
 
    p = (char *)matrix;
    int i = (rand()) % 9;
    p = p + i;
    for (t = 0; *p != SPACE && t < 9; ++t) p++;
    if (t == 9)
    {
        printf("draw\n");
        exit(0); /* game over */
    }
    else *p = 'O';
 
}
 
/* отображение игровой доски */
void disp_matrix(void)
{
    SetColor(7, 9);
    printf("\n");
    int t;
    for (t = 0; t < 3; t++)
    {
 
        printf(" %c | %c | %c", matrix[t][0], matrix[t][1], matrix[t][2]);
        if (t != 2) printf("\n - | - | - \n");
 
    }SetColor(7, 0);
    printf("\n");
 
}
 
/* проверка на победу */
char check(void)
{
    int t;
    char *p;
    for (t = 0; t < 3; t++) { /* проверка строк */
        p = &matrix[t][0];
        if (*p == *(p + 1) && * (p + 1) == *(p + 2)) return *p;
    }
    for (t = 0; t < 3; t++) { /* проверка столбцов */
        p = &matrix[0][t];
        if (*p == *(p + 3) && *(p + 3) == *(p + 6)) return *p;
    }
 
    /* проверка диагоналей */
    if (matrix[0][0] == matrix[1][1] && matrix[1][1] == matrix[2][2])
        return matrix[0][0];
    if (matrix[0][2] == matrix[1][1] && matrix[1][1] == matrix[2][0])
        return matrix[0][2];
    return SPACE;
}
 
void renew()
{
    for (int i = 0; i < 9; i++)
        for (int j = 0; j < 9; j++)
            matrix[i][j] = SPACE;
}

Решение задачи: «Не записывает в файл , выбрасывает с сообщением buffer!=nullptr»

textual
Листинг программы
#include <stdio.h>
#include <time.h>
#include <windows.h> 
 
 
#define SPACE ' '
#define N 3
 
char matrix[3][3] = { /* матрица для крестиков-ноликов */
    { SPACE, SPACE, SPACE },
    { SPACE, SPACE, SPACE },
    { SPACE, SPACE, SPACE }
};
 
 
enum ConsoleColor
{
    Black = 0,
    DarkBlue = 1,
    Green = 2,
    Blue = 3,
    Red = 4,
    Magenta = 5,
    Yellow = 6,
    White = 7,
    Gray = 8,
    LightBlue = 9,
    LightGreen = 10,
    LightMagenta = 11,
    LightRed = 12,
    Cyan = 13,
    LightYellow = 14,
    LightWhite = 15
 
};
 
 
void SetColor(int text, int background)
{
    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(hStdOut, (WORD)((background << 4) | text));
}
 
 
void get_computer_move(void);
void get_player_move(void);
void disp_matrix(void);
char check(void);
void renew();
//void zapis_disp();
void main()
{
 
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    srand(time(NULL));
 
 
    int z = 1;
    FILE* fp;
    char done;
 
    fp = fopen("tabl.txt", "a");//если ужо и считать из файла измените "а" на "а+"
 
    while (z != 2)
    {
        printf("\n 1-Сыграть в "крестики - нолики" \n");
        printf("\n 2-Выйти из игры \n");
        scanf("%d", &z);
        if (z == 2) break;
 
        printf("\n<br>Играем в "крестики - нолики"<br>\n");
        printf("\n<br>Вы играете против искусственного интеллекта<br>\n");
        done = SPACE;
 
        do {
 
            disp_matrix(); /* вывод игровой доски */
            get_player_move(); /* ходит игрок */
            printf("Вы походили! \n");
            disp_matrix(); /* вывод игровой доски */
            Sleep(1000);
            done = check(); /* проверка на победу */
            if (done != SPACE) break; /* победитель */
            printf("Компьютер ходит! \n");
            Sleep(300);
            get_computer_move(); /* ходит компьютер */
            system("cls");
            done = check(); /* проверка на победу */
        } while (done == SPACE);
 
        if (done == 'X') printf(" Поздравляем!Вы выиграли! \n");
        else printf(" Выиграл компьютер!!!! \n");
 
        //disp_matrix(); /* отображение результирующего положения */
        Sleep(3000);
 
        //Save to File
        if (fp != NULL)
        {
            printf("Вы добавили состояние поля \n\n");
            for (int i = 0; i < N; i++)
            {
                for (int j = 0; j < N; j++)
                    fprintf(fp, "%c", matrix[i][j]);
                fprintf(fp, "\n");
            }
            fprintf(fp, "\n");
            printf("\n Состояние поля успешно добавлено в файл: tabl.txt \n\n");
        }
        else printf("Невозможно открыть файл на запись.\n");
 
        system("cls");
        renew();
        system("cls");
    }
 
    fclose(fp);
    exit(0);
}
 
/* ввод хода игрока */
void get_player_move(void)
{
    int y;
    int x;
    printf("Введите координаты вашего X.\n");
    printf("Номер строки? ");
    scanf("%d", &x);
 
    printf("Номер столбца? ");
    scanf("%d", &y);
    x--; y--;
 
    if (x < 0 || y < 0 || x>2 || y>2 || matrix[x][y] != SPACE)
    {
        printf("Измените координаты, вы вышли за границы поля.\n");
        get_player_move();
    }
    else SetColor(13, 10); { matrix[x][y] = 'X'; }
}
 
/* ход компьютера */
void get_computer_move(void)
{
    int t;
    char *p = (char *)matrix;
    int i = (rand()) % 9;
    p = p + i;
 
    for (t = 0; *p != SPACE && t < N; ++t) p++;
 
    if (t == N)
    {
        printf("draw\n");
        exit(0); /* game over */
    }
    else *p = 'O';
 
}
 
/* отображение игровой доски */
void disp_matrix(void)
{
    SetColor(7, 9);
    printf("\n");
    int t;
    for (t = 0; t < N; t++)
    {
 
        printf(" %c | %c | %c", matrix[t][0], matrix[t][1], matrix[t][2]);
        if (t != 2) printf("\n - | - | - \n");
 
    }SetColor(7, 0);
    printf("\n");
 
}
 
/* проверка на победу */
char check(void)
{
    int t;
    char *p;
    for (t = 0; t < N; t++) { /* проверка строк */
        p = &matrix[t][0];
        if (*p == *(p + 1) && * (p + 1) == *(p + 2)) return *p;
    }
    for (t = 0; t < N; t++) { /* проверка столбцов */
        p = &matrix[0][t];
        if (*p == *(p + 3) && *(p + 3) == *(p + 6)) return *p;
    }
 
    /* проверка диагоналей */
    if (matrix[0][0] == matrix[1][1] && matrix[1][1] == matrix[2][2])
        return matrix[0][0];
    if (matrix[0][2] == matrix[1][1] && matrix[1][1] == matrix[2][0])
        return matrix[0][2];
    return SPACE;
}
 
void renew()
{
    for (int i = 0; i < N; i++)
        for (int j = 0; j < N; j++)
            matrix[i][j] = SPACE;
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.625 из 5
Похожие ответы