从文件C ++读取奇怪的整数

时间:2010-12-13 16:59:57

标签: c++ arrays file-io

真的试过四处看看,用过搜索。使用Google,尝试了很多方法,但我无法弄清楚这一点。 (我想对于那些说流利的C ++的人来说,这真的很容易。)

这是一个非常简单的家庭作业,但我不知道它为什么会这样工作。
这是代码:

int temp;
string fname;
cout << "Kerem a fajlnevet: ";
cin >> fname;`

ifstream f;
f.open(fname.c_str());

int szam_madar, szam_helyseg;

f >> szam_madar;
f >> szam_helyseg;

int matrix[szam_helyseg * szam_madar];
for (int i = 1; i <= szam_helyseg; i++)
    {
        for(int j=1; j <= szam_madar; j++)
        {
            f >> matrix[i*szam_madar + j];
        }
    }

maximalisHelyseg(matrix,szam_helyseg,szam_madar);`

我在阅读时使用的文字:
5 5 1 2 1 2 1 2 1 2 1 2 1 2 2 1 2 1 2 1 2 1 2 1 1

应该创建一个5x5数组,然后按顺序填充它 现在......结果完全不同。
对于前几个阵列成员,它给出了像2686048,4686232等等。

2 个答案:

答案 0 :(得分:1)

C / C ++数组为0。他们的指数从0开始,到长度为1。程序中的第一个错误是此循环的索引。你应该从[0,szam_helyseg-1]和[0,szam_madar-1]开始

for (int i=1; i <= szam_helyseg; i++)
    {
        for(int j=1; j <= szam_madar; j++)
        {
            f >> matrix[i*szam_madar + j];
        }
    }

此外,由于您尝试表示Matrix,如果使用2D数组,则有利于代码的清晰度。这将摆脱索引算法(如i * szam_madar + j),这也可能是很难找到错误的来源。

答案 1 :(得分:1)

你有类似的东西:

for (int i=1; i <= szam_helyseg; i++)
{
    for(int j=1; j <= szam_madar; j++)
    {
        f >> matrix[i*szam_madar + j];
    }
}

但是数组索引从0开始计数,因此最简单的方法是

for (int i=0; i < szam_helyseg; i++)
{
    for(int j=0; j < szam_madar; j++)
    {
        f >> matrix[i*szam_madar + j];
    }
}

等。您可以看到,在初始迭代中,计算的索引是0,而在原始中,它从szam_madar + 1开始(这表示出现了错误)。

此外,可变长度数组不是标准C ++(指行int matrix[szam_helyseg * szam_madar];)。使用数组new运算符,或(更好)vector<int>