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;
}
运行演示