文本文件中的值未写入2D数组?

时间:2016-01-28 22:39:10

标签: c++ arrays multidimensional-array char

我试图获取文本文件的值并将其加载到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]; 

2 个答案:

答案 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;,你就不能期望它加载积分。这适用于您的前两个片段(相同)。我假设您不小心将代码复制粘贴两次,因为它们完全相同。它实际上非常令人困惑。

你的第三个人有xy作为循环变量;他们在执行chessBoards[x][y] = point;时超出了范围。 看起来像您已经两次声明xy,一次接近此代码的顶部,一次在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中重新声明yfor是有问题的。我很确定这不是一个错误,因为它们处于不同的范围内,但我不是100%在这个特定的范围规则上......主要是因为你是什么使用循环变量在程序中没有意义。如果是我,我可能只是将chessBoards[x][y] = point;放在内循环中,因为我认为这就是你所追求的。

编辑添加:paddy是正确的,如果你想要一个8元素的数组,你需要声明它像array[8]不是 array[7]