我正在努力在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;
}
如何以及在哪裏聲明瞭directoryTable? – 2012-02-07 03:40:32
目錄表在文件的最開始處聲明。這是一個全局變量(我知道,tsk tsk)。它被聲明如下:DirectoryEntry * directoryTable。 – Tom 2012-02-07 03:50:34
如果你的教授告訴你編寫不帶'std :: string'或任何標準庫的C++代碼,那麼他不會教你C++。 – dreamlax 2012-02-07 04:09:31