数组的值随机变化

时间:2014-08-04 14:28:47

标签: c++ arrays struct

所以我有一个文本文件,其中包含有关篮球运动员的信息,它看起来像这样:

8
9 5 7 -5 13 -4 11
7 5 -3 12 -5 17 -3
25 7 12 -3 5 -5 7 -5 3
14 5 12 -3 10 -7 8
5 1 -40
33 5 15 -5 9 -3 8
11 5 -12 8 -5 12 -3
13 5 3 -4 25 -5 3

第一行中的第一个整数表示有多少玩家。在每隔一行中,第一个整数是玩家的编号,第二个整数表示该行中有多少个整数,并且以下每个整数都显示玩家是否正在玩(如果整数是正数)或坐在替补(如果数字是负数)。

我想将信息读取到一个看起来像这样的结构数组:

struct player
{
    int nr;
    int k;
    int bus[];
};

我写了一个函数来执行此操作:

void skaitymas(int &n, player mas[])
{
    ifstream duom("U1.txt");
    duom >> n;
    for (int i=0; i < n; i++) {
        duom >> mas[i].nr >> mas[i].k;
        for (int f=0; f < mas[i].k; f++) {
            duom >> mas[i].bus[f];
        }
    }
}

当我运行它时程序似乎工作,但结构数组保存意外的值。在随机位置添加一些cout命令之后,我发现它第一次将正确的值保存到数组中,首先是循环循环,但是在一些迭代之后它会更改先前数组的值。例如,当for循环中的i等于1时,mas[1].bus[0]将保存为-3,但应该是i更改为{ {1}},2更改为mas[1].bus[0]

如果你能帮我解决一下,为什么数组中的数字会改变为文本文件中的其他随机数,我会很感激,即使我没有对它们做任何事情。

1 个答案:

答案 0 :(得分:1)

您的代码存在一些问题。最明显的是 int bus[]声明一个类型不完整的变量, 用C语言声明成员变量在C ++中是非法的 不完全类型。除非你的编译器被严重破坏,否则 不应该编译;最迟,你应该得到一个错误 当你写mas[i]时,因为没有可行的方法 指向不完整类型的指针的指针算术。方式 宣布你的班级是:

struct Player
{
    int nr;
    std::vector<int> bus;
};

一旦你这样做,你应该能够编译。不过,它还是 非常差的C ++来读取以下元素的数量。该 这样做的正确方法是放弃计数 file:行数是玩家的数量,而且 行中第一个后面的整数是数字 第一行之后的整数。如果你这样做, 你得到的结果如下:

std::vector<Player> skaitymas()
{
    std::ifsteram duom( "U1.txt" );
    if ( !duom.is_open() ) {
        //  Some sort of error handling, maybe an exception.
    }
    std::vector<Player> results;
    std::string line;
    while ( std::getline( duom, line ) ) {
        std::istringstream s( line );
        int nr;
        s >> nr;
        if ( !s ) {
            //  Format error...
        }
        results.push_back(Player{ nr });
        while ( s >> nr ) {
            results.back().bus.push_back( nr );
        }
    }
    return results;
}

一切都是动态完成的(在C ++中非常简单)。