Не записывает в файл , выбрасывает с сообщением 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;
}