2

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

它给了我:访问冲突,但不能给我确切的行。我对 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

4 回答 4

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。

于 2011-06-02T11:38:19.867 回答
2

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

以 j` 开头的问题while (j!=11){'. Note how在此循环中上升到 10。这意味着你的内在维度至少需要为 11。

于 2011-06-02T11:41:13.193 回答
0

所以你的访问冲突是因为你越过了数组的末尾,当你用 10 定义和数组时,你有元素 0-9。另请参阅我上面的评论。

于 2011-06-02T11:38:27.230 回答
0

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

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

What bordis 实际上是指向该内存的指针。数组使用指针算法工作,即使用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],您很可能会遇到访问冲突,因为该内存不属于到数组。

于 2011-06-02T11:59:09.163 回答