我试图获取文本文件的值并将其加载到2D数组中。我遇到的问题是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];
答案 0 :(得分:2)
让我们从一行开始处理两个错误:
var express = require('express');
var app = express();
//more modules
var Comment = require('./models/comment.js');
var Cat = require('./models/cat.js');
//home route
app.get('/cats', function(req,res) {
Cat.find({}, function(err, cats) {
if (err) {
console.log(err);
} else {
res.render('cats', {cats: cats});
}
})
});
首先,您必须使用char chessBoards[BOARD_SIZE - 1][BOARD_SIZE - 1] = {{'A'}};
(不 BOARD_SIZE
)作为维度。这将允许在0到BOARD_SIZE-1
之间进行索引。你的循环中有未定义的行为。
由于你已经注销了数组的末尾,你可能会破坏堆栈中的其他变量,任何事情都可能发生。像这样宣布董事会:
BOARD_SIZE-1
其次,初始化不将每个元素初始化为char chessBoards[BOARD_SIZE][BOARD_SIZE];
。它只初始化第一个,然后将每个其他元素归零。您想要'A'
(来自std::fill_n
):
<algorithm>
或只是std::fill_n( (char*)chessBoards, BOARD_SIZE * BOARD_SIZE, 'A' );
(oldschool styles):
memset
现在实际的板读数。你为每个角色重写了整个棋盘。这意味着当您的memset( chessboards, 'A', sizeof(chessBoards) );
循环最终完成时,该板将包含已读取的最后一个字符。这可能是一个新行,所以稍后输出电路板就会显示为空。
基本上,你在循环的错误部分读取文件。这样做:
while
答案 1 :(得分:0)
嗯,很明显,如果你从不写chessBoards[x][y] = point;
,你就不能期望它加载积分。这适用于您的前两个片段(相同)。我假设您不小心将代码复制粘贴两次,因为它们完全相同。它实际上非常令人困惑。
你的第三个人有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
显然,在x
中重新声明y
和for
是有问题的。我很确定这不是一个错误,因为它们处于不同的范围内,但我不是100%在这个特定的范围规则上......主要是因为你是什么使用循环变量在程序中没有意义。如果是我,我可能只是将chessBoards[x][y] = point;
放在内循环中,因为我认为这就是你所追求的。
编辑添加:paddy是正确的,如果你想要一个8元素的数组,你需要声明它像array[8]
,不是 array[7]
。