average_angela Ответов: 1

Попытка считывания данных из текста и копирования этих данных в массив


текстовый файл представляет собой таблицу n на n, которую я уже знаю "n", и это максимум 50. так что стол будет выглядеть примерно так:
##*
#*#
*##
я создал hidden_board[50][50] , так что нужно скопировать данные из текстового файла в массив и для '#' поставить число 10, а для '*' поставить число 11.
я много чего усложнял но это то что у меня есть до сих пор:
это так грязно неэффективно и не работает и когда я печатаю массив он показывает:
10 11 0
10 11 0
0 11 0
я не знаю, откуда взялись нули. может ли кто - нибудь сказать мне, как правильно это сделать?

Что я уже пробовал:

char my_board_dummy[n*n];
    int my_board_dummy1[n*n];
    int i=0;
    FILE* file;
    if ((file=fopen("minesweeper.txt" , "r"))) {
        char c;
        while ((c=fgetc(file))!=EOF)
            my_board_dummy[i++]=c;
        for (int i=0; i<n*n; ++i){
            if (my_board_dummy[i]=='#')
                my_board_dummy1[i]=10;
            else if (my_board_dummy[i]=='*')
                my_board_dummy1[i]=11;
        }
        for (int i=0; i<n*n; ++i){
            hidden_board[i/n][i%n-1]=my_board_dummy1[i];
        }

Richard MacCutchan

Почему вы используете фиктивный массив в первую очередь? Когда вы читаете каждую строку текста, установите соответствующие записи в массиве на значения 10 или 11 в зависимости от того, какой символ вы читаете. Вы также должны убедиться, что Ваш массив имеет точно такой же размер, как и элементы в файле данных.

1 Ответов

Рейтинг:
1

OriginalGriff

Вам не нужны две петли, вы можете сделать это с одной:

while ((c=fgetc(file))!=EOF)
    {
    my_board_dummy[i++] = c == '#' ? 10 : 11;
    }
Но... если ваш входной файл содержит строки, вам будет лучше сделать две вещи:
1) сохраните значение "n" в файле в качестве первой строки и выделите ровно столько места для платы, когда вы читаете размер из файла. Сделайте доску двумерным массивом, и у вас есть координаты x и y для доступа к каждому местоположению. Это значительно облегчает работу с остальной частью вашего кода.
2) Используйте два вложенных цикла for вместо while:
2.1) выходной цикл считывает целую строку текста из файла, увеличивая y.
2.2) внутренний цикл обрабатывает каждую строку и преобразует символы в значения платы, увеличивая X. Затем для каждого местоположения у вас есть место x и y для заполнения.

Но... саперные игры обычно не основаны на файлах: вы обычно заполняете доску "пустыми" квадратами, а затем используете генератор случайных чисел, чтобы выбрать "n" мест, которые являются минами, и заменить пустой квадрат в каждом месте значением мины.

Я бы также предложил сделать вашу доску на 2 квадрата больше в каждом направлении, чем она должна быть, и заполнить эту новую область "пустыми" квадратами. Затем вы работаете с координатами X и Y от 1 до n включительно (вместо 0 до n - 1) и можете получить доступ к пользовательской координате плюс и минус один в обоих направлениях. Это означает, что когда вы "ищете пустое пространство" (средний щелчок в Windows Minesweeper), вам вообще не нужно проверять края, и это делает ваш код намного чище.


average_angela

Эй, спасибо за обратную связь. я понял проблему: поскольку в текстовом файле есть несколько строк, в конце каждой строки есть нулевой символ, и это вызвало проблему. я починил его и теперь он работает:
int hidden_board[50][50];
Файл* файл;
если ((файл=с помощью функции fopen("minesweeper.txt" , "Р"))) {
чар с;
for (int i=0; i<n; ++i){
for (int j=0; j<n; ++j){
c= fgetc(файл);
если (c=='#'){
hidden_board[i][j]= 10;
}
иначе если (c=='*')
hidden_board[i][j]= 11;
еще
--Дж;
}
}