Не записывает в файл , выбрасывает с сообщением 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; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д