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;
 }

运行演示

配置文件来增大spark内存_配置文件