文本文件中的值未写入 2D 数组
values from text file not being written to 2D array?
我正在尝试获取文本文件的值并将其加载到二维数组中。我遇到的问题是 char 变量的值似乎只覆盖了每个空白位置,我不确定为什么。
所以我打开了文件,我可以访问它来读取它的内容或在屏幕上显示它们,并像这样设置我的 2D 数组:
char chessBoards[BOARD_SIZE - 1][BOARD_SIZE - 1] = {{'A'}}; // All elements of 2D array initialized
int x = 0; // line position - which line we are looking at
int y = 0; // row position - which row we are looking at
在此测试中,输出是所有带有单个 D 字符的 C 字符,我后来告诉它是,所以我的问题似乎是文本文件的位置没有复制到 char 变量。
file.open(games);
char point = 'Z';
while (file.get(point))
{
for (int x = 0; x < BOARD_SIZE; x++)
{
for (int y = 0; y < BOARD_SIZE; y++)
{
chessBoards[x][y] = point;
}
}
}
chessBoards[1][1] = 'D';
cout << chessBoards[1][1];
for (int x = 0; x < BOARD_SIZE; x++)
{
for (int y = 0; y < BOARD_SIZE; y++)
{
cout << "chessBoards[" << x << "][" << y << "]: ";
cout << chessBoards[x][y] << endl;
}
}
但是在这个变化中,除了一个"D"之外,每个值都是空白的。
file.open(games);
char point = 'Z';
while (file.get(point))
{
for (int x = 0; x < BOARD_SIZE; x++)
{
for (int y = 0; y < BOARD_SIZE; y++)
{
chessBoards[x][y] = 'C';
}
}
}
cout << chessBoards[1][1];
for (int x = 0; x < BOARD_SIZE; x++)
{
for (int y = 0; y < BOARD_SIZE; y++)
{
cout << "chessBoards[" << x << "][" << y << "]: ";
cout << chessBoards[x][y] << endl;
}
}
这告诉我它一开始就没有正确从文件中获取值,但是在此版本中,在顶部显示文件的内容没有问题。但是,如果我尝试将其他内容放在同一区域中,它只会覆盖数组的第一个位置并停止。
file.open(games);
char point = 'Z';
while (file.get(point))
{
for (int x = 0; x < BOARD_SIZE; x++)
{
for (int y = 0; y < BOARD_SIZE; y++)
{
chessBoards[x][y] = 'C';
}
}
chessBoards[x][y] = 'C';
chessBoards[x][y] = point;
cout << point;
}
chessBoards[1][1] = 'D';
cout << chessBoards[1][1];
让我们从一行中的两个错误开始:
char chessBoards[BOARD_SIZE - 1][BOARD_SIZE - 1] = {{'A'}};
首先,必须对维度使用BOARD_SIZE
(而不是BOARD_SIZE-1
)。 这将允许在 0 和 BOARD_SIZE-1
(含 0 和)之间建立索引。 你的循环中有未定义的行为。
由于您一直在注销数组的末尾,因此您可能会丢弃堆栈中的其他变量,并且任何事情都可能发生。 像这样声明板:
char chessBoards[BOARD_SIZE][BOARD_SIZE];
其次,该初始化不会初始化要'A'
的每个元素。 它只初始化第一个元素,然后把其他元素归零。 你想要类似std::fill_n
的东西(来自<algorithm>
):
std::fill_n( (char*)chessBoards, BOARD_SIZE * BOARD_SIZE, 'A' );
或者只是memset
(老派风格):
memset( chessboards, 'A', sizeof(chessBoards) );
现在实际的板读数。 你一直在为每个角色重写整个棋盘。 这意味着当您的while
循环最终完成时,板将包含读取的最后一个字符。 这可能是一个换行符,所以稍后输出板时它看起来是空的。
从本质上讲,您正在循环的错误部分从文件中读取。 请改为执行以下操作:
file.open( games );
if( file.is_open() )
{
for( int x = 0; x < BOARD_SIZE; x++)
{
for (int y = 0; y < BOARD_SIZE; y++)
{
char point = 'C';
if( !file.get( point ) )
std::cout << "Error reading " << x << "," << y << std::endl;
chessBoards[x][y] = point;
}
}
}
,很明显,如果你从不写chessBoards[x][y] = point;
,你不能指望它加载点。这适用于您的前 2 个代码段(完全相同)。我假设您不小心复制粘贴了两次代码,因为它们完全相同。这实际上很令人困惑。
第三个将x
和y
作为循环变量;执行chessBoards[x][y] = point;
时它们超出了范围。看起来您声明了两次x
和y
,一次在此代码的顶部附近,一次在for
中。如果是这样的话,你不应该写for (int y = 0; y < BOARD_SIZE; y++)
;你可能想要for (y = 0; y < BOARD_SIZE; y++) // note the missing 'int'
。
以下程序演示了此问题:
#include <iostream>
using namespace std;
int main()
{
int x = 0;
int y = 0;
for(int x = 0; x < 2; x++) {
for(int y = 0; y < 2; y++) {
cout << "x: " << x << ", y: " << y << endl;
}
}
cout << "nx: " << x << ", y: " << y << endl;
return 0;
}
这输出:
x: 0, y: 0
x: 0, y: 1
x: 1, y: 0
x: 1, y: 1
x: 0, y: 0
显然,在for
中重新宣布x
和y
是有问题的。我很确定这不是错误,因为它们在不同的范围内,但我不是 100% 在这个特定的范围规则上......主要是因为你对循环变量所做的事情在程序中没有意义。如果是我,我可能会把chessBoards[x][y] = point;
放在内部循环中,因为我认为这就是你所追求的。
编辑添加:paddy 是正确的,如果你想要一个 8 元素数组,你需要像 array[8]
一样声明它,而不是array[7]
。
- 2D数组来自文本输入,中间有空格
- 如何使用用户输入在C++中正确填充2D数组
- 如何在C++中检查2D数组中负值的输入验证
- 当我在main中声明了我的2d数组时,为什么我的程序会退出
- 如何将以逗号和空格分隔的整数读取到 2D 数组中?
- 如何在C++函数中声明静态 2D 数组?
- 我已经阅读了很多关于 2d 数组的信息,但我在作业中使用它时遇到了麻烦
- 使用矢量将文本文件中的输入存储到 2D 数组中
- 获取 2D 数组 c++ 中的所有数字对
- 这是使用回溯的 nqueen 问题,但我使用了动态 2d 数组,我的程序编译良好,但不返回任何输出
- 如何在构造函数中使用初始值设定项设置具有相同值的 2d 数组?
- 在 Python 和 c++ 2d 数组初始化之间.这是怎麽?为什么呢?
- 如何创建一个所有行大小不同的 2D 数组,并且用户将指定每行将有多少个元素?
- 使用指针算法修改函数中的 2D 数组
- 在C++中初始化和打印 2D 数组
- 有没有办法使用输入的维度初始化 2d 数组中的所有项目而不循环C++?
- C++ 2D 数组写入多个位置
- 检测到堆损坏:在正常块 c++ 动态 2D 数组之后
- 如何从initializer_list初始化 2D 数组
- 交换函数不是在 C++ 中交换 2D 数组的元素