2012-02-07 26 views
0

我正在努力在C++中創建一個基本的文件系統,並且正在爲我的目錄表中的文件分配名稱。這是一個directoryEntry結構體的定義。Char陣列似乎被神祕地解除分配

typedef struct{ 
    char name[112]; 
    unsigned int index; 
    unsigned int size; 
    unsigned int type; 
    unsigned int creation; 
} directoryEntry; 

這裏是一些代碼,我創建一個新的空白文件。

if(canFit){ 
    for (int i = 0; i < numClusters; ++i){ 

     if (directoryTable[i].name[0] == 0x00){ 
      //directoryTable[i].name = *newFile; 
      strcpy(directoryTable[i].name, newFile); 
      printf("%s %d ", directoryTable[i].name, i); 
      directoryTable[i].index = location; 
      directoryTable[i].size = 0; 
      directoryTable[i].type = 0x0000; 
      directoryTable[i].creation = time(NULL); 
      return 0; 
     } 
    } 

這裏發生了什麼是我正在掃描目錄表中包含空字節作爲文件名的第一個字符的條目。這告訴我該特定的目錄條目未被佔用。然後我使用strcpy來分配newFile(它被聲明爲一個參數,作爲char newFile [112])。 (printf(「%s%d」,directoryTable [i] .name,i);)但是它似乎是包含在directoryTable [i]中的數據。名稱被刪除。上面的代碼包含在名爲touch的方法中。當代碼執行時,我得到如下內容:

touch(「file1」); file1的0

觸摸(「file2的); file2的0

這意味着相關聯的索引爲0的值被臨時變更成file1的,但是然後變回幾個空字節(這是它是如何)所以我的問題是,爲什麼directoryTable [i]的值不能通過多次調用來保持相同?directoryTable是一個全局變量,因此如果賦值,它不應該在超出範圍時消失。

還應該注意的是,directoryTable被定義爲directoryEntry * directoryTable,如果這對我的問題有任何影響的話。

我的教授不會允許我們使用C++中的大多數標準庫。例如,字符串是非法的。所以如果你想知道,那就是爲什麼我不使用字符串。

謝謝你的時間。

編輯:

這裏是組成directoryTable的directoryEntrys分配並添加到directoryTable代碼。它們也被添加到一個文件,但我覺得那是無關緊要的這一特定問題:

fseek(fp, clusterSize * root, SEEK_SET); 

    for (int i = 0; i < bootRecord[0]/128 ; ++i){ 
     fseek(fp, clusterSize * root + 128 * i, SEEK_SET); 

     directoryEntry * newEntry = (directoryEntry *)malloc(sizeof(directoryEntry)); 
     //newEntry->name = (char *)malloc(112); 
     //memset(newEntry->name, 0x00, 112); 
     newEntry->size = 0; 
     newEntry->type = 0; 
     newEntry->creation = 0x0000; 
     newEntry->index = 0; 

     fwrite(newEntry->name, 112, 1, fp); 
     fwrite(&newEntry->size, sizeof(int), 1, fp); 
     fwrite(&newEntry->type, sizeof(int), 1, fp); 
     fwrite(&newEntry->creation, sizeof(int), 1, fp); 
     fwrite(&newEntry->index, sizeof(int), 1, fp); 

     directoryTable[i] = *newEntry; 
    } 
+0

如何以及在哪裏聲明瞭directoryTable? – 2012-02-07 03:40:32

+0

目錄表在文件的最開始處聲明。這是一個全局變量(我知道,tsk tsk)。它被聲明如下:DirectoryEntry * directoryTable。 – Tom 2012-02-07 03:50:34

+1

如果你的教授告訴你編寫不帶'std :: string'或任何標準庫的C++代碼,那麼他不會教你C++。 – dreamlax 2012-02-07 04:09:31

回答

0

你需要某種形式的實際存儲的爲您的目錄表中定義:

#define NUM_FILES 15 
DirectoryEntry directoryTable[NUM_FILES] 

指針你我們已經定義了隨機記憶。我很驚訝它沒有段錯誤。

編輯

您的malloc DirectoryEntries,但你不能將它們存儲在任何地方有效。你有沒有存儲你的指針,所以你只要將它們分配給directoryTable失去他們你要麼需要創建的DirectoryEntry數組*:

DirectoryEntry* directoryTable[MAX_ENTRIES] 

,你可以把你的malloc」 d指針或者在運行時創建整個表格:

DirectoryEntry* directoryTable; 

int newFS(int size, int clusterSize) { 
    //Use C++ 'new' instead of malloc 
    directoryTable = new DirectoryEntry[size/clusterSize]; 

    //Make sure to 'delete directoryTable' at program completion. 
} 
+0

但是,可能的文件數量取決於文件系統的大小除以文件系統創建時確定的羣集大小。我需要保持directoryTable全球,但我不認爲我可以做到這一點考慮到這一點。另外,爲了澄清,我確保在將每個目錄條目添加到目錄表之前爲每個目錄條目添加必要的空間。 – Tom 2012-02-07 04:21:40

+0

你如何將它們添加到表格中?你的定義只說你有一個指向單個或一組DirectoryEntrys的指針。 – Collin 2012-02-07 04:51:37

+0

我會將條目分配給目錄表的代碼添加到原始帖子中。 – Tom 2012-02-07 05:01:03