while (fat[item].item != -1)item = fat[item].item;//计算保存该文件的最后一块盘块号
时间: 2024-01-11 22:02:13 浏览: 53
这段代码的意思是:根据文件分配表(FAT)中的信息,计算保存该文件的最后一块盘块号。具体操作是,从文件的第一块盘块开始,通过查找FAT表中该盘块对应的项,获取下一块盘块的盘块号。如果下一块盘块的盘块号不为-1,则继续查找下一块盘块,直到找到最后一块盘块,即下一块盘块的盘块号为-1。最终,该代码返回的是保存该文件的最后一块盘块的盘块号。
相关问题
int item = curDir->directItem[cur].firstDisk;//目标文件的起始磁盘块号 while (fat[item].item != -1)item = fat[item].item;//计算保存该文件的最后一块盘块号 char* first = fdisk + item * DISK_SIZE + fSize % DISK_SIZE;//计算该文件的末地址
这段代码的作用是计算目标文件的末地址,具体操作如下:
首先,从目录项中获取目标文件的起始磁盘块号,赋值给变量item。
然后,利用while循环计算保存该文件的最后一块盘块号,即最后一块磁盘块的盘块号。具体操作和上一个问题中的解释一样,不再赘述。
接着,利用fSize%DISK_SIZE计算出目标文件在最后一块盘块中的偏移量,即该文件的末地址在最后一块盘块中的起始位置。
最后,根据最后一块盘块的盘块号和该文件在最后一块盘块中的偏移量,计算文件的末地址,即fdisk + item * DISK_SIZE + fSize % DISK_SIZE。
最终,该代码返回的是目标文件的末地址。
void write(string* str,char *content,int size) { char fName[20];strcpy_s(fName, str[1].c_str()); //在当前目录下查找目标文件 int i, j; for (i = 2; i < MSD + 2; i++) if (!strcmp(curDir->directItem[i].fileName, fName) && curDir->directItem[i].type == 0) break; if (i >= MSD + 2) { cout << "找不到该文件!" << endl; return; } int cur = i;//当前目录项的下标 int fSize = curDir->directItem[cur].size;//目标文件大小 int item = curDir->directItem[cur].firstDisk;//目标文件的起始磁盘块号 while (fat[item].item != -1)item = fat[item].item;//计算保存该文件的最后一块盘块号 char* first = fdisk + item * DISK_SIZE + fSize % DISK_SIZE;//计算该文件的末地址 //如果盘块剩余部分够写,则直接写入剩余部分 if (DISK_SIZE - fSize % DISK_SIZE > size) { strcpy_s(first, content); curDir->directItem[cur].size += size; } //如果盘块剩余部分不够写,则找到空闲磁盘块写入 else { //先将起始磁盘剩余部分写完 for (j = 0; j < DISK_SIZE - fSize % DISK_SIZE; j++) { first[j] = content[j]; } int res_size = size - (DISK_SIZE - fSize % DISK_SIZE);//剩余要写的内容大小 int needDisk = res_size / DISK_SIZE;//占据的磁盘块数量 int needRes = res_size % DISK_SIZE;//占据最后一块磁盘块的大小 if (needDisk > 0)needRes += 1; for (j = 0; j < needDisk; j++) { for (i = USER_ROOT_STARTBLOCK + 1; i < DISK_NUM; i++) if (fat[i].state == 0) break; if (i >= DISK_NUM) { cout << "磁盘已被分配完!" << endl; return; } first = fdisk + i * DISK_SIZE;//空闲磁盘起始盘物理地址 //当写到最后一块磁盘,则只写剩余部分内容 if (j == needDisk - 1) { for (int k = 0; k < size - (DISK_SIZE - fSize % DISK_SIZE - j * DISK_SIZE); k++) first[k] = content[k]; } else { for (int k = 0; k < DISK_SIZE; k++) first[k] = content[k]; } //修改文件分配表内容 fat[item].item = i; fat[i].state = 1; fat[i].item = -1; } curDir->directItem[cur].size += size; } }
在您的代码中,出现了一个strcpy_s函数调用错误。错误信息指出,没有与参数列表匹配的重载函数 "strcpy_s" 实例。这通常是因为传入的参数类型与函数声明不匹配导致的。在这种情况下,您需要检查调用strcpy_s函数的参数类型是否正确。
在您的代码中,您使用了一个char数组fName来存储文件名。然后,您使用strcpy_s函数将文件名复制到fName数组中。这里的问题可能是在调用strcpy_s函数时,传入的参数类型与函数声明不匹配。请确保传入的参数类型正确,并且检查函数声明是否正确。此外,也要确保已经包含了正确的头文件。
为了解决这个问题,您可以尝试将strcpy_s函数替换为strcpy函数,因为在此代码中,没有必要使用strcpy_s函数的安全特性。这样,您就可以避免与参数列表不匹配的问题。
阅读全文