2011-06-02 53 views
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(); 
} 
+0

可能真正的错误是在读取部分,并没有在那里正确创建数组。 – sth 2011-06-02 11:29:36

+1

和“bord”尺寸是?另外bord [0] [0] ==“z”可能应该是=='z' – 2011-06-02 11:29:59

+0

您能显示“bord”声明吗?可能外环的范围是错误的。 – 2011-06-02 11:32:37

回答

2

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

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

+0

谢谢!我们解决了它!高五,男:P – user780049 2011-06-02 11:46:12

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。

+0

我的文件是这样的: z(j = 0) 宽度10(i 0-9)的十行(j 1-10) 文件结尾 – user780049 2011-06-02 11:43:24

+0

应该我在另一个字符串中写第一行? – user780049 2011-06-02 11:43:49

+0

@ user780049:是的,将第一行存储在另一个变量中是有意义的,因为它与其他变量不同,并且可能具有不同的含义。你也可以将它保存在同一个数组中,但是你需要将数组大小增加到11. – interjay 2011-06-02 11:46:45

0

因此,您的访问违规是因为您要经过数组的末尾,当您定义和使用10进行数组时,您的元素为0-9。另请参阅我上面的评论。

+0

好,但是当我说bord [9] [10]时(因为上面有另一行告诉你轮到谁了)它给了我这样的警告/错误。 – user780049 2011-06-02 11:39:45

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个元素是10个字符串的数组。所以bord[1][0]在这种情况下意味着bord + 1*(sizeof(string[10]))

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

在你的情况,参考bord[0][10]例如当,你会真正在bord[1][0]的值,因为内存后10串的第一阵列是10串的另一个数组引用,但是当bord[10][0],你最有可能得到访问违规,因为这个内存不属于数组。