Нужна помощь в чтении из файла и сохранении содержимого в 2d массив - PullRequest
0 голосов
/ 15 июня 2019

Я пытаюсь прочитать файл и сохранить содержимое в 2D-массив для создания шахматной доски. Файл имеет положение фигур (состояние платы). Я думаю, что все хорошо, но запустить я запускаю это сбой сборки. Я не получаю сообщений об ошибках или какой строке это вызывает, поэтому я не уверен, что пошло не так.

Я пытался использовать разные методы scanf и fgets. Наконец, я добавил метод "show", чтобы увидеть доску. Я думаю, что это сбой.

int main(int argc, char** argv)

{ 
FILE *in; //Create 2 file variables
char line[50];
int chessBoard[8][8];
int turn = 0;
in = fopen("board.csv","r");
int true = 1;
void show(int[][8]);
if(in == NULL )
{
    printf("The file specified couldn't be opened"
            "\nClose program and try again");
    true = 0;
    return 1;
}
else
{
  fscanf(in, "%d", &line);
      for (int i = 0; i < 8; i++) 
      {
    for (int j = 0; j < 8; j++)
        {
       fscanf(in, "%d", &chessBoard[i][j]);
    }
       }
}
show(chessBoard);
return 0;
}

void show(int chessBoard[8][8])
{
    for(int row = 0; row < 8; row++)
    {
        for(int col = 0; col< 8; col++)
        {
            printf("%d",chessBoard[row][col]);

            if(chessBoard[row][col] < 0)
            {
                printf("    ");
            }
            else
            {
                printf("    ");
            }
            if(col != 7)
            {
                printf("|");
            }
            printf("\n");
        }
    }

предполагается распечатать состояние платы, но когда я запускаю его, я получаю "сбой запуска".

Ответы [ 3 ]

1 голос
/ 15 июня 2019

Не удосужившись получить исходный код для компиляции, есть как минимум две очевидные ошибки:

fscanf(in, "%d", &line);

читает десятичное целое число, но имеет несовместимый аргумент для его сохранения.

show(chessBoard[8][8]);

это не способ позвонить show().В качестве аргумента вы указываете только одно целое число, которое дополнительно выходит за пределы chessBoard.

0 голосов
/ 16 июня 2019

следующий предложенный код:

  1. включает комментарии к вопросу
  2. аккуратно компилируется
  3. выполняет желаемую функциональность
  4. правильно очищаетпосле этого self
  5. использует соответствующий вертикальный интервал
  6. использует согласованный стиль отступа
  7. не использует «магические» числа

Предостережение: предлагаемый кодвыводит только «положительные» значения положения и печатает пробелы для «отрицательных» значений положения

, а теперь предложенный код

#include <stdio.h>
#include <stdlib.h>


#define MAX_ROWS  8
#define MAX_COLS  8

void show(int board[ MAX_ROWS ][ MAX_COLS ]);


int main( void )
{  
    int chessBoard[ MAX_ROWS ][ MAX_COLS ];

    FILE *in = fopen("board.csv","r");
    if( !in )
    {
        perror( "fopen to read board.csv failed" );
        exit( EXIT_FAILURE );
    }


    for (int i = 0; i < MAX_ROWS; i++) 
    {
        for (int j = 0; j < MAX_COLS; j++)
        {
            fscanf(in, "%d", &chessBoard[i][j]);
        }
    }

    show(chessBoard);
    fclose( in );
    return 0;
}


void show(int chessBoard[ MAX_ROWS ][ MAX_COLS ])
{
    for(int row = 0; row < MAX_ROWS; row++)
    {
        for(int col = 0; col < MAX_COLS; col++)
        {
            printf("|");
            if(chessBoard[row][col] < 0)
            {
                printf("    ");
            }

            else
            {
                printf("%4d",chessBoard[row][col]); //edited
            }
        }
        printf("|\n");
    }
}
0 голосов
/ 16 июня 2019

Эй, я думаю, я исправил ошибки, проблема была в том, как был сохранен входной файл. Теперь он просто выводит мусор. Я также отредактировал мой метод «шоу». Выход:

enter image description here

Вот файл в документе заметки (я добавил '[]', потому что так он должен выглядеть в массиве).

   a   b  c  d  e  f  g  h
8  [-4][-2][-3][-6][-5][-3][-2][-4]
7  [-1][-1][-1][-1][-1][-1][-1][-1]

6  [0][0][0][0][0][0][0][0]
5  [0][0][0][0][0][0][0][0]
4  [0][0][0][0][0][0][0][0]
3  [0][0][0][0][0][0][0][0]

2  [1][1][1][1][1][1][1][1]
1  [4][2][3][5][6][3][2][4]

Вот мой обновленный код с @ user3629249 справкой

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_ROWS  8
#define MAX_COLS  8

void show(int board[ MAX_ROWS ][ MAX_COLS ]);

int main(int argc, char** argv)

{ 
FILE *in; //Create 2 file variables
int line[50];
 int chessBoard[ MAX_ROWS ][ MAX_COLS ];
int turn = 0;
in = fopen("board.csv","r");
int true = 1;


if(in == NULL )
{
    printf("The file specified couldn't be opened"
            "\nClose program and try again");
    true = 0;
    return 1;
}
else
{
    for (int i = 0; i < MAX_ROWS; i++) 
    {
        for (int j = 0; j < MAX_COLS; j++)
        {
            fscanf(in, "%d", &chessBoard[i][j]);
        }
    }

}
show(chessBoard);
return 0;
}

void show(int chessBoard[][8])
{
    for(int row = 0; row < MAX_ROWS; row++)
    {
        for(int col = 0; col< MAX_COLS; col++)
        {
            printf("|");
            if(chessBoard[row][col] < 0)
            {
                printf("    ");
            }

            else
            {
                printf("%07d",chessBoard[row][col]);
            }
        }
        printf("|\n");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...