2011-06-02 78 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],你最有可能得到訪問違規,因爲這個內存不屬於數組。