C 模拟连续文件分配

C 模拟连续文件分配,c,operating-system,C,Operating System,我一直在努力解决这个问题: 用C编写源代码,在以下条件下模拟连续文件分配: 提示用户输入文件数 输入文件名 输入起始区块编号 输入文件占用的块数 条件是:(任何两个文件都不能有相同的块“如果用户输入的相同块在前一个文件中不存在,则提示用户块已在使用”) 守则: #include<stdio.h> #include<conio.h> struct { char fname[10]; } f[10]; main() { int n,i,j,b[20],s

我一直在努力解决这个问题:

用C编写源代码,在以下条件下模拟连续文件分配:

提示用户输入文件数 输入文件名 输入起始区块编号 输入文件占用的块数 条件是:(任何两个文件都不能有相同的块“如果用户输入的相同块在前一个文件中不存在,则提示用户块已在使用”)

守则:


#include<stdio.h>
#include<conio.h>

struct
{
    char fname[10];
} f[10];

main()
{
    int n,i,j,b[20],sb[20],t[20],x,c[20][20];
    printf("Enter no. of files: ");
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        printf("Enter file %d name: ", i+1);
        scanf("%s", f[i].fname);
        printf("Enter no. of blocks occupied by file %s: ",f[i].fname);
        scanf("%d",&b[i]);
        printf("Enter the starting block of file %s: ",f[i].fname);
        scanf("%d",&sb[i]);
        t[i]=sb[i];
        for(j=0;j<b[i];j++)
            c[i][j]=sb[i]++;
    }
    
    printf("Filename\tStart block\tlength\n");
    for(i=0;i<n;i++)
        printf("%s\t %d \t%d\n",f[i].fname,t[i],b[i]);
    printf("blocks occupiedate:\n");
    
    for(i=0;i<n;i++)
    {
        printf("file name %s ",f[i].fname);
        for(j=0;j<b[i];j++)
            printf("\t%d",c[i][j]);
        printf("\n");
    }
}

#包括
#包括
结构
{
char-fname[10];
}f[10];
main()
{
int n,i,j,b[20],sb[20],t[20],x,c[20][20];
printf(“输入文件编号:”);
scanf(“%d”和“&n”);

对于(i=0;i来说,您的代码很难理解,部分原因是单字母变量名,但似乎您正在将第i个文件的起始块和长度存储在sb[i]和b[i]中

假设是这样,当输入第i个文件详细信息时,您需要检查它是否与以前的任何i-1文件重叠

// compare i'th file against all previous files, in turn.
overlap = false;
for (k=0; k<i-1; k++) {
    if (sb[i] >= sb[k] && sb[i] < sb[k] + b[k]) {
        // start of i'th file is inside k'th file
        overlap = true;
        break;
    }
    if (sb[i] + b[i] >= sb[k] && sb[i] + b[i] < sb[k] + b[k]) {
        // end of i'th file is inside k'th file
        overlap = true;
        break;
    }
}

// if overlap is true here, then reject the current file details
//依次将第i个文件与以前的所有文件进行比较。
重叠=假;
对于(k=0;k=sb[k]&&sb[i]=sb[k]&sb[i]+b[i]

我是在头顶上打出来的,所以你应该仔细检查,尤其是边缘条件(比如,我是否正确使用了小于或等于?)。正如所有最好的教科书中所说,验证是留给学生的一个练习

您还可以检查我是否理解问题的术语;-)
我看到了(在数组
c[][]
中)可能是一种分配位图的尝试,这可能更符合“模拟文件系统”(没有文件系统将新文件创建与所有现有文件进行比较)的精神,所以可能我选错了树结构。如果是这样,您需要填写问题的更多详细信息。

每次输入新文件时,您都会知道它从开始到开始占用块+长度-1;让我们称之为文件的“范围”。您的工作是跟踪到目前为止输入到您的程序中的所有文件的范围,并对照前面的所有文件检查每个文件。非常感谢您的帮助,但请您更简要地解释一下:(我很难找出我应该使用的“如果”条件。