配置文件,配置块存储文件,块大小可在配置文件中设置,将3个文件存储在块中

来源:互联网 发布:java 多线程 回调函数 编辑:程序博客网 时间:2024/05/21 09:24

config.h文件中的内容

#ifndef CONFIG_H
#define CONFIG_H

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<iostream.h>

char w_blocknumber[15];
char w_blocksize[15];


int setconfig();
int setfile();
void config();

#endif


config.c中的内容

主要负责建立配置文件和存储文件

#include "config.h"

int setconfig()
{
    FILE * fp;


strcpy(w_blocknumber,"blocknumber=10");
strcpy(w_blocksize,"blocksize=2K");
// blocknumber = 10;
// blocksize = 2048;//字节


 
    if((fp = fopen ("configfile.txt","wb"))==NULL)
    {
        printf("cant open the file");
        exit(0);
    }
 


    fputs(w_blocknumber,fp);
fputs(w_blocksize,fp);
    fclose (fp);
    return 0;
}
int setfile()
{
FILE * fp;
//建立文件1
if((fp = fopen ("1.txt","wb"))==NULL)
    {
        printf("cant open the file");
        exit(0);
    }
fclose (fp);
    //建立文件2
if((fp = fopen ("2.txt","wb"))==NULL)
    {
        printf("cant open the file");
        exit(0);
    }
fclose (fp);
//建立文件3
if((fp = fopen ("3.txt","wb"))==NULL)
    {
        printf("cant open the file");
        exit(0);
    }
fclose (fp);
    return 0;
}
void config()
{
setconfig();
setfile();

}

main.c中的内容

负责计算文件大小和块存储

#include "config.h"


int blocknumber;
int blocksize;
int filesize1,filesize2,filesize3;//保存三个文件的字节数


int getconfig()//将配置文件里面的配置生效
{
char r_blocknumber[20];//故意设置成20,设置的大点不要紧,其实只需要15个就够了
char r_blocksize[20];
char flash_blocknumber[20] = "blocknumber=";
char flash_blocksize[20] = "blocksize=";




FILE * fp;
   if((fp=fopen("configfile.txt","r"))==NULL) //rb代表按照二进制的方式进行读
    {
      printf("cant open the file");
      exit(0);
    }
   fgets(r_blocknumber,13,fp);//将配置文件中的数据读出来进行配置
  // printf("%s",r_blocknumber);
 //  printf("%s",flash_blocknumber);
   if (strcmp(r_blocknumber, flash_blocknumber) == 0)//如果字符串匹配
   {


  fgets(r_blocknumber,3,fp);//0数组好像是没用
  blocknumber = (r_blocknumber[0]-48)*10+r_blocknumber[1]-48;//计算块最多是多少(限制块数为10-99)因为取出来的是ASCII码,所以减48
//   printf("%d",blocknumber);
   }
   fgets(r_blocksize,11,fp);//继续将配置文件中的数据读出来进行配置这次读的是blocksize,所以用r_blocksize
//   printf("%s",r_blocksize);
   if (strcmp(r_blocksize, flash_blocksize) == 0)//如果字符串匹配
   {


  fgets(r_blocksize,3,fp);//不知道为什么要读3个,但是读两个就是不对
  blocksize = (r_blocksize[0]-48)*1024;//ASCII码-48之后再乘以1024字节,计算每个块的大小
//   printf("%d",blocksize);
   }






 //  fgets(r_blocksize,6,fp);
  // printf("%s",r_blocksize);


fclose (fp);
return 0;
}


void filecount()//计算每个文件所占的字节数
{
FILE *fp;
fp=fopen("1.txt","r");   /*此处请填写测试文件的地址,并以只读("r")方式打开文件*/
    if( fp==NULL )  /*如果打开的文件不存在,则退出*/
    { 
       printf("文件打开失败!");
  exit(0);
    }
    fseek(fp,0L,SEEK_END);   /*利用fseek函数将指针定位在文件结尾的位置*/
    filesize1=ftell(fp);   /*利用ftell函数返回指针相对于文件开头的位置,以字节计算*/
    printf("文件所占的字节数为%d个\n",filesize1);   /*进行输出*/
fclose(fp);
    //重复计算filesize


fp=fopen("2.txt","r");   /*此处请填写测试文件的地址,并以只读("r")方式打开文件*/
    if( fp==NULL )  /*如果打开的文件不存在,则退出*/
    { 
       printf("文件打开失败!");
  exit(0);
    }
    fseek(fp,0L,SEEK_END);   /*利用fseek函数将指针定位在文件结尾的位置*/
    filesize2=ftell(fp);   /*利用ftell函数返回指针相对于文件开头的位置,以字节计算*/
    printf("文件所占的字节数为%d个\n",filesize2);   /*进行输出*/
fclose(fp);
    //重复计算filesize




fp=fopen("3.txt","r");   /*此处请填写测试文件的地址,并以只读("r")方式打开文件*/
    if( fp==NULL )  /*如果打开的文件不存在,则退出*/
     { 
       printf("文件打开失败!");
  exit(0);
     }
    fseek(fp,0L,SEEK_END);   /*利用fseek函数将指针定位在文件结尾的位置*/
    filesize3=ftell(fp);   /*利用ftell函数返回指针相对于文件开头的位置,以字节计算*/
    printf("文件所占的字节数为%d个\n",filesize3);   /*进行输出*/
fclose(fp);
}


void print_block()
{
int blockno;
int file1_block,file2_block,file3_block;//分别代表file1,file2,file3所占的block数
char temp[20000]={" "};//故意定义的大点,并且初始化为空,如果不初始化,输出的时候会乱码
FILE *fp;
printf("input blockno:");//输入要输出的块号
scanf("%d",&blockno);


file1_block = filesize1/blocksize;//file1所占的block数
    file2_block = filesize2/blocksize;//file2所占的block数
file3_block = filesize3/blocksize;//file3所占的block数


if(blockno <= file1_block)//如果其块号保存的是文件1的内容
{
printf("此为文件1.\n");
fp=fopen("1.txt","rb"); //打开1文件
fseek(fp,blockno * blocksize,0);//定位指针到此块的开头字节
if(blockno == file1_block)//如果是保存文件1的最后一个块号
{
if((fread(temp,filesize1%blocksize,1,fp)==1))//输出最后一个块号的内容,需要求余计算最后一个块号存储了多少字节
printf("%s\n",temp);
}
else//不是保存文件1的最后一个块号
{
if((fread(temp,blocksize,1,fp)==1))//输出整个块内保存的内容
printf("%s\n",temp);
}
fclose(fp);//关闭文件1


}
else if(blockno <= file1_block + file2_block + 1)//保存文件2的块号,文件1用的块号加上文件2用的块号
{
printf("此为文件2.\n");
fp=fopen("2.txt","rb"); //打开2文件
fseek(fp,(blockno - file1_block - 1) * blocksize,0);//定位指针到文件2中此块的开头字节:(当前块号-file1用掉的块号-1)*块的大小
                                                                //后面的这个-1是为了定位到开头而不是结尾,后面对3文件的定位也是一个道理
if(blockno == file1_block + file2_block + 1)//如果是保存文件2的最后一个块号,       
{
if((fread(temp,filesize2%blocksize,1,fp)==1))//输出最后一个块号的内容,需要求余计算最后一个块号存储了多少字节
printf("%s\n",temp);
}
else//不是保存文件2的最后一个块号
{
if((fread(temp,blocksize,1,fp)==1))//输出整个块内保存的内容
printf("%s\n",temp);
}
fclose(fp);//关闭文件2


}
else if(blockno <= file1_block + file2_block + 1 + file3_block + 1)//保存文件3的块号,当前块号小于等于文件1用的块号+文件2用的+文件3用的
{
printf("此为文件3.\n");
fp=fopen("3.txt","rb"); //打开3文件
fseek(fp,(blockno - (file1_block + file2_block + 1 ) - 1) * blocksize,0);//定位指针到文件3中此块的开头字节:(当前块号-文件1和文件2用掉的块号 - 1)*块的大小
if(blockno == file1_block + file2_block + 1 + file3_block + 1)//如果是保存文件3的最后一个块号,
{
if((fread(temp,filesize3%blocksize,1,fp)==1))//输出最后一个块号的内容,需要求余计算最后一个块号存储了多少字节
printf("%s\n",temp);
}
else//不是保存文件3的最后一个块号
{
if((fread(temp,blocksize,1,fp)==1))//输出整个块内保存的内容
printf("%s\n",temp);
}
fclose(fp);//关闭文件3


}
else
{
//如果有文件4可以继续添加
}




}






int main()
{
// config();//生成配置文件,如果已经生成可注释掉
getconfig();//获取配置信息
filecount();//计算文件大小并输出
print_block();//输出文件块保存的内容
return 0;
}

运行演示




原创粉丝点击