需要帮助来读取文件并将内容存储到二维数组中

时间:2019-06-15 20:14:39

标签: c

我正在尝试读取文件并将内容存储到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 个答案:

答案 0 :(得分:1)

无需费心去编译您的源代码,至少有两个明显的错误:

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

读取一个十进制整数,但是有一个不兼容的参数来存储它。

show(chessBoard[8][8]);

并非呼叫show()的方式。您只给它一个整数作为参数,该整数另外从chessBoard的边界中取出。

答案 1 :(得分:0)

嘿,我想我已修复错误,问题是如何保存输入文件。现在,它只输出垃圾。我还编辑了我的“显示”方法。 输出:

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");
    }
}

答案 2 :(得分:0)

以下建议的代码:

  1. 将评论纳入问题
  2. 干净地编译
  3. 执行所需的功能
  4. 自检后正确清理
  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");
    }
}