访问冲突循环和写入

时间:2011-06-02 11:24:45

标签: c++ for-loop access-violation writing

好的,我已经检查过每一个关于此的问题,但我仍然无法弄明白。我需要使用循环将字符串数组写入文件。我的阅读部分工作正常,但是这个在我调试时并不具体。所以,这就是问题所在。

它给了我:访问冲突,但不能给我确切的行。 我对c ++很陌生,而且我不善于处理异常。编辑:  变量和数组在上部声明,但我会给它们。

string bord[10][10];
string line;
int i=0,j=1;
ifstream ifile ("test.txt");
//readfile
if (ifile.is_open()){
    getline (ifile,line);
    bord[0][0].assign(line,0,1);
    cout << "i=" << i << " j=" << j<< " inhoud - " << bord[0][0] << endl;
    while (j!=11){
        getline (ifile,line);
        cout << line << endl;
        i=0;
        while (i!=10){
            bord[i][j].assign(line,i,1);
            cout << "i=" << i << " j=" << j<< " inhoud - " << bord[i][j] << endl;
            i++;
        }
        j++;
    }
    ifile.close();
}
ofstream ofile ("test2.txt", ios_base::trunc);
                    //Write File
if (ofile.is_open()){
    if(bord[0][0]=="z"){
        ofile << "zwart";
    }
    else{
        ofile << "wit";
    }
                    //START LOOPING FOR OUTPUT
    for(j=1; j<11; j++){
        ofile << endl;
        for(i=0; i<10; i++){
            cout <<  "i=" << i << " j=" << j<< " inhoud - " << bord[i][j] << endl;
            ofile << bord[i][j];
        }
    }
    ofile.close();
}

4 个答案:

答案 0 :(得分:3)

您的外部for循环为for(j=1; j<11; j++),这意味着j的值为1到10(含)。但是数组定义为string bord[10][10],因此只有索引0到9才有效。

将循环更改为for(j=0; j<10; j++)。您还需要以相同的方式修复while循环,因为它还会为j提供值1..10而不是0..9。

答案 1 :(得分:2)

bord上的尺寸不正确。根据您自己的代码,它应该是string bord[10][11];而不是string bord[10][10];

问题从while (j!=11){'. Note how j`开始,这个循环达到10。这意味着你的内在维度必须至少为11。

答案 2 :(得分:0)

因此,您的访问冲突是因为您要经过数组的末尾,当您使用10定义和数组时,您有0-9的元素。另见上面的评论。

答案 3 :(得分:0)

其他人已经通过使用错误的索引来回答您的代码无法正常工作的原因。由于你是C ++的新手,我想我会提供更多细节。

C ++中的数组由连续的内存表示。当您声明一个字符串数组时,例如:string bord[10],它有效地为10个字符串对象分配内存。

bord实际上是指向该内存的指针。数组使用指针算术,即使用bord [4]时,它意味着bord + 4*sizeof(string),这意味着在返回指针之前有4个字符串元素。因此,bord[4]指向数组的第5个元素。这就解释了为什么C ++数组是基于0的。

现在,当声明像string bord[10][10]这样的两个维数组时,它会分配一个包含10个元素的数组,这些元素是10个字符串的数组。因此bord[1][0]在这种情况下意味着bord + 1*(sizeof(string[10]))

如果你的索引大于数组的大小,你将检索可能不属于你的数组的内存(记住指针算术)。这就是所谓的缓冲区溢出。

在你的情况下,例如,当引用bord[0][10]时,你真的会得到bord[1][0]的值,因为第一个10个字符串数组后的内存是10个字符串的另一个数组,但引用时bord[10][0] 1}},你最有可能获得访问冲突,因为这个内存不属于数组。