C++ 访问冲突循环和写入

C++ 访问冲突循环和写入,c++,for-loop,access-violation,writing,C++,For Loop,Access Violation,Writing,好的,我已经查过了关于这个的每一个问题,但我还是不明白。我需要使用循环将字符串数组写入文件。我的read部分工作正常,但这一部分在调试时并不具体。所以,问题来了 它给我:访问冲突,但不能给我确切的线路。 我对C++非常陌生,而且我不擅长异常处理。 变量和数组在上一节中声明,但我将给出它们 string bord[10][10]; string line; int i=0,j=1; ifstream ifile ("test.txt"); //readfile if (ifile.is_open(

好的,我已经查过了关于这个的每一个问题,但我还是不明白。我需要使用循环将字符串数组写入文件。我的read部分工作正常,但这一部分在调试时并不具体。所以,问题来了

它给我:访问冲突,但不能给我确切的线路。 我对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();
}

你的外for循环是forj=1;j因此,访问冲突是因为您要经过数组的末尾,当您定义并使用10进行数组时,元素为0-9。另请参见我上面的评论。

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


问题从whilej开始=“11”{“注意,WHJ”用这个循环上升到10。这意味着你的内部维度至少需要11。

< P>其他人已经回答了为什么你的代码不使用错误索引。因为你是C++新手,我想我会给出更多的细节。 在C++中,数组是用连续内存表示的。当你声明一个字符串数组时,例如:String Bord[10 ],它有效地分配10个字符串对象的内存。

实际上BoD实际上是指向那个内存的指针。数组使用指针运算,也就是使用Bord[4 ]时,它表示Bord+4×sieOfString,这意味着在指针返回之前有4个字符串元素。因此,Bord[4 ]指向数组的第五个元素。这解释了为什么C++数组是基于0的。 现在,当声明类似字符串bord[10][10]的二维数组时,它会分配一个包含10个元素的数组,这些元素是由10个字符串组成的数组。因此,bord[1][0]在本例中表示bord+1*sizeofstring[10]

如果您的索引大于数组的大小,您将检索到可能不属于您的arrayremember指针算法的内存。这就是所谓的缓冲区溢出


例如,在您的情况下,当引用bord[0][10]时,您将真正获得bord[1][0]处的值,因为第一个10字符串数组之后的内存是另一个10字符串数组,但在引用bord[10][0]时,您很可能会遇到访问冲突,因为此内存不属于数组。

可能真正的错误在读取部分,并且数组没有在那里正确创建。bord维度也是bord[0][0]==z可能应该是=='z'你能显示bord声明吗?可能外循环范围是错误的。如果你一次写一个字符,我会期望bord[j][I]不是[I][j]。是的,对,但这不是我的问题。这总是x,y所以……好吧,但当我说bord[9][10]因为上面还有一行告诉你该轮到谁了,它给了我这样一个警告/错误。我的文件是这样的:z j=0十行j 1-10宽10 i 0-9文件的末尾我应该把第一行写在另一个字符串中吗?@user780049:是的,将第一行存储在另一个变量中是有意义的,因为它与其他变量不同,并且可能具有不同的含义。您也可以将其保留在同一数组中,但需要将数组大小增加到11。