kh945926945 2017-05-03 12:43 采纳率: 0%
浏览 802

递归中出现的写入冲突问题

`int init(FILE* file,int startbyte, int endcount,char * path,int model,char *operation) {

int containsItem = 0;
struct RootEntry rootEntryObj;
struct RootEntry* rootEntry=&rootEntryObj;
int i = 1;
int startOfData = 19 * 512 + RootEntCnt * 32;//数据区的开始位置
int fileNumber = 0;
int dirNumber = 0;


for (i;i <= endcount;i++) {

    fseek(file, startbyte, SEEK_SET);
    fread(rootEntry, 1, 32, file);//读取一个文件项到一个rootEntry结构体当中
    //判断rootEntry项的属性,是文件还是目录,可怜找不到具体哪个数字对应哪种文件,只知道0x20是txt

    startbyte += 32;//指针移动32个字节

    if (rootEntry->DIR_Attr == 0)//有大量为0的条目,此处过滤
        continue;
    if ((!(rootEntry->DIR_Name[0] >= 65 && rootEntry->DIR_Name[0] <= 90))&&(!(rootEntry->DIR_Name[0] >= 97 && rootEntry->DIR_Name[0] <= 122)))
        continue;
    if (rootEntry->DIR_Attr == 0x20) {//文件
        containsItem = 1;
        char filename[12];
        int j = 0;
        for (j;j < 11;j++) {
            if ((rootEntry->DIR_Name[j] >= 65 && rootEntry->DIR_Name[j] <= 90) || (rootEntry->DIR_Name[j] >= 97 && rootEntry->DIR_Name[j] <= 122))
                filename[j] = rootEntry->DIR_Name[j];
            else
                break;
        }
        filename[j] = '.';
        filename[j + 1] = rootEntry->DIR_Name[8];
        filename[j + 2] = rootEntry->DIR_Name[9];
        filename[j+3] = rootEntry->DIR_Name[10];
        filename[j + 4] = '\0';

        char copypath[100];
        strcpy(copypath, path);
        stringAdd(copypath,filename);//copypath此时加入了名字

        if (model == 1) {
            simplePrint(copypath);//调用打印程序
            printf("\n");
        }
        if (model == 3) {
            if (stringEqualTail(path, operation)) {
                fileNumber++;
            }
        }



        else if (model == 2) {


            if (stringEqual(path, operation) == 2)
                simplePrint(copypath);


            if (stringEqual(copypath, operation) == 2) {
                findfile = 1;
                int startClusNumber;//开始簇号
                startClusNumber = rootEntry->DIR_FstClus;
                int data_ptr;//指向该目录在数据区的位置
                data_ptr = startOfData + (startClusNumber - 2)*SecPerClus*BytsPerSec;//数据区指针
                //查询FAT表,确定是否只占有一个数据簇,FAT1表的起始字节为512字节,但是前三个字节是固定的,故偏移从第四个字节开始,即簇号为2则扫描4,5字节,然后右移四位,簇号为3则扫描5,6字节并且左移四位,4则6,7
                by2 fatValue=0;
                char test[3];
                while (fatValue < 0xFF8) {
                    if (startClusNumber % 2 == 0) {//偶数的FAT项
                        fseek(file, 512+startClusNumber+1, SEEK_SET);
                        fread(test, 1, 2, file);
                        fatValue = fatValue >> 4;//右移四位
                    }
                    else {//奇数的FAT项
                        fseek(file, 516, SEEK_SET);
                        //fseek(file, 512+startClusNumber + 1, SEEK_SET);
                        fread(&fatValue, 1, 2, file);
                        fatValue = fatValue << 4;//左移四位
                    }
                    char contentOfFile[512];
                    fseek(file, data_ptr, SEEK_SET);
                    fread(contentOfFile, 1, 512, file);//将内容填充到了数组中

                    simplePrint(contentOfFile);
                    data_ptr= startOfData + (fatValue - 2)*SecPerClus*BytsPerSec;//更新data_ptr
                }
            }
        }


    }
    else if(rootEntry->DIR_Attr==0x10){//目录
        containsItem = 1;
        char dirName[12];
        int j = 0;
        for (j;j < 11;j++) {
            if ((rootEntry->DIR_Name[j] >= 65 && rootEntry->DIR_Name[j] <= 90) || (rootEntry->DIR_Name[j] >= 97 && rootEntry->DIR_Name[j] <= 122)||(rootEntry->DIR_Name[j]>='0'&&rootEntry->DIR_Name[j]<='9'))
                dirName[j] = rootEntry->DIR_Name[j];
            else
                break;
        }
        dirName[j] = '\0';

        char copypath[100];
        strcpy(copypath, path);
        stringAdd(copypath,dirName);
        stringAdd(copypath, "/");//此时copypath已经认定了当前目录


        //发现是目录,去寻找开始簇号
        int startClusNumber;//开始簇号
        startClusNumber= rootEntry->DIR_FstClus;
        int data_ptr;//指向该目录在数据区的位置
        data_ptr=startOfData + (startClusNumber-2)*SecPerClus*BytsPerSec;



        if (model == 3) {
            if (stringEqualTail(path, operation)) {//表示已经到达目标目录内
                dirNumber++;
                char copyOperation[100];
                strcpy(copyOperation, dirName);
                init(file, data_ptr, 512 / 32, copypath, 3, dirName);//此处有问题
            }
            else {
                init(file, data_ptr, 512 / 32, copypath, 3, operation);
            }

        }


        else if (model == 1) {
            if (!init(file, data_ptr, 512 / 32, copypath, 1, operation)) {//有内容就不打印,留待最后的时候将全路径打印出来
                simplePrint(copypath);
                printf("\n");
            }
        }
        else if (model == 2) {
            if (stringEqual(copypath, operation)==2) {
                if (!init(file, data_ptr, 512 / 32, copypath, 1, operation)) {//有内容就不打印,留待最后的时候将全路径打印出来
                    simplePrint(copypath);
                    printf("\n");
                }
            }
            else if (stringEqual(copypath, operation) == 1) {
                init(file, data_ptr, 512 / 32, copypath, 2, operation);
            }
        }
    }
}

if (model == 3&& stringEqualTail(path, operation)) {
    simplePrint(operation);
    simplePrint("dirNumber is ");
    simplePrint(itoa(dirNumber));
    simplePrint("\n");
    simplePrint("fileNumber is ");
    simplePrint(itoa(fileNumber));
    simplePrint("\n");
}

return containsItem;

}`

这段代码是用来读取FAT12文件系统的,model是命令的一个参数,表示不同的模式,文件和目录都有三种模式下的对应处理方法,互相不干扰,主要是model=3时会出现问题,model=3是计数,operation是目录名,model=3的时候会把operation的目录第一级的子目录数和文件数打印,再对operation的子目录也进行同样的统计。很奇怪的是model=3的时候目录处理中递归的那一句会导致循环的i执行到i=4的时候就无法执行了,在for(i;i<endcout;i++)的地方就写入冲突,感觉不明白,i是个局部变量啊,递归也不会对这个i造成影响啊,但是删了这句递归i 就能正常加了,求指点!

  • 写回答

1条回答 默认 最新

  • devmiao 2017-05-03 21:33
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 LiBeAs的带隙等于0.997eV,计算阴离子的N和P
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 matlab有关常微分方程的问题求解决
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?
  • ¥100 求三轴之间相互配合画圆以及直线的算法