我正在用c ++创建一个基本的文件系统,并且在我的目录表中为文件分配名称时遇到了问题。这是directoryEntry结构的定义。
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中正确打印(printf(“%s%d”,directoryTable [i] .name,i);)但是它似乎包含在directoryTable [i] .name中的数据被删除。上面的代码包含在一个名为touch的方法中。当代码执行时,我得到如下内容:
触摸( “文件1”); 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 :(得分:0)
您需要为目录表定义某种实际存储:
#define NUM_FILES 15
DirectoryEntry directoryTable[NUM_FILES]
您定义的指针只指向随机存储器。我很惊讶它不会发生段错误。
修改强>
您对DirectoryEntries进行了malloc,但是您没有将它们存储在任何有效的位置。您的指针没有存储空间,因此只要将它们分配给directoryTable就会丢失它们您需要创建一个DirectoryEntry数组*:
DirectoryEntry* directoryTable[MAX_ENTRIES]
你可以放置malloc指针,或者只是在运行时创建整个表:
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.
}