2013-05-07 76 views
-2

如何編輯結構的單個成員?例如,我想改變entity.namefoobar的。代碼修改單個結構成員

部分:

void editing1(int cnt, int qq) 
{ 
    Entity z; 
    char tempc[255]; 
    int tempi = 0; 
    cout << "Type in new name: "; 
    cin >> tempc; 
    qq--; 
    Entity* ss = new Entity[cnt]; 
    while (fread(&z, sizeof z, 1, file)) { 
     ss[tempi] = z; 
     if (tempi == qq) { 
      (*ss[tempi].name = *tempc); 
     }; 
     tempi++; 
    }; 

    purge(); 
    for (int ii = 0; ii < cnt; ii++) { 
     fwrite(&ss[ii], sizeof(Entity), 1, file); 
    }; 
    fclose(file); 
    system("cls"); 
}; 

但我得到這個:

snifty letters

而且它還有......破壞整個文件。原文:

good little symbols

也有人解釋爲什麼它會損壞整個文件,而不是它被使用的部分?

+0

C和C++不是相同的語言。由於你的代碼看起來像C一樣,我已經刪除了C++標記。 – JBentley 2013-05-07 22:04:24

+0

@JBentley - 然而,它也包含'cout'和'cin',它們顯然不是直的'C' - 也就是說,恢復'C++'標籤沒什麼意義。 – 2013-05-07 22:08:58

回答

1

這條線在這裏是可疑......

(*ss[tempi].name=*tempc);

注意ss是一個指向cntElement陣列 - 所以,如果要訪問tempi元素,正確的方法不是(*ss[tempi]) b UT ss[tempi] - 如果你想訪問name屬性的第一個元素,然後*ss[tempi].name會做到這一點。

然而,tempc是炭和不數組索引數組,數組中的第一個元素的地址。 *tempc將是第一個字節中的單個字符。

的問題是,我不知道什麼是ss[tempi].name爲了告訴你分配給它的正確方法。這將是我的解決方案如果name是一個字符指針。

ss[tempi].name=tempc;

如果name是一個字符數組,你可能會想這樣的事情...

strncpy(ss[tempi].name, tempc, sizeof(ss[tempi].name));

*ss[tempi].namename的第一個字符 - 如你所說,屬性是char name[255] - 因此,通過name本身是第一個字符的該數組中的地址和​​是實際的第一個字符。同樣是*tempc如此 - 那麼,你是從tempc第一個字節複製到name,這一切。

而且,你不能給它們分配複製陣列...

char array1[255] = "hello world"; 
char array2[255]; 

array2 = array1; 

也就是說法律C。你需要使用一個字符串副本來做到這一點,你也需要防止緩衝區溢出,所以你會這樣做...

char array1[255] = "hello world"; 
char array2[255]; 

strncpy(array2, array1, sizeof(array2)); 
+0

ss [tempi] .name也是一個255個char的數組。 (ss [tempi] .name,tempc,sizeof((* ss)[tempi] .name)); - 也不能幫助我,因爲它不允許我使用(* ss)[tempi] .name)部分,但是在remove()之後也會破壞整個文件。 – undefined 2013-05-07 22:12:42

+0

是啊...這是我的錯誤 - 它應該是'sizeof(ss [tempi] .name)' - 編輯相應。 – 2013-05-07 22:13:53

+0

仍然。沒有幫助升技。 – undefined 2013-05-07 22:18:05