文件的读写

来源:互联网 发布:知识管理 知乎 编辑:程序博客网 时间:2024/04/29 16:53

在实现小功能之前先说明文件的读写包括两种方式:

1. 二进制读写涉及到的函数如下:

    fseek, ftell, fwrite, fread此些函数均以字节为单位;

2. ASCII码读写涉及的函数如下:

   fgetc, fprintf, fscanf等,此种读写不会涉及文件的定位

以上两种的读写方法函数不能混淆使用;

 

下面是要实现的功能说明:

 1 一. 准备数据,写入data_a.txt文件中                                                                                               

  2     1.首先在0-300之间产生一个随机数A(即一分钟内的心率)
  3 
  4     2.一分钟内的采样点个数为200x60,即开辟buff[200x60],在0-200x60之间随机出A个不同的值,
  5       作为buff的下标,并将产生的这些下标值设置为1,其余值为0;
  6 
  7     3.将生成的buff[200x60]的数据全部写入文件data_a.txt中;
  8       以此类推将下一分钟生成的buff追加到data_a.txt中直到存满200x3590秒的数据为止;
  9 
 10 二. 从文件data_a.txt中按一定规律读取数据,并将读取的数据存入data_b.txt中
 11     1. 首先从data_a.txt中读取buff[200x60]的数据,并判读接近buff末尾最近的数据为1的下标m,
 12        将buff[0-m]的所有数据写入data_b.txt中;
 13 
 14     2. 将data_a.txt的文件指针移动到离文件头m处,开始读取buff[200x60]的数据,并判断接近buff
 15        末端最近的数据为1的下标m1,将buff[0-m1]的所有数据追加到data_b.txt中;
 16 
 17     3. 将data_a.txt的文件指针移动m1个数据,并在此处读取buff[200x60]的数据,并判断接近buff
 18        末端最近的数据为1的下标m2,将buff[0-m2]的所有数据追加到data_b.txt中;
 19 
 20     4. 以此类推直到将data_a.txt中全部数据按以上规律读取到data_b.txt中为止;
 21 
 22 三. 比较data_a.txt文件与data_b.txt文件是否相同

 23     用脚本文件md5sum命令实现


以下时代码实现:

以下是datacreat.c的代码,针对以上一部分的功能说明:               

  1 #include <stdio.h>                                                                                                               
  2 #include <stdlib.h>
  3 #include <string.h>
  4 #include <time.h>
  5 
  6 #define BUFF 200*60
  7 
  8 void main()
  9 {
 10     int num = 2;//实验2分钟数据存储
 11     int a, i, j;
 12     int n;
 13     short int data[BUFF];//一分钟的BUFF大小
 14 
 15     //文件不存在创建文件,文件存在打开后以二进制形式写入,并且只要文件不关闭就会一直往后写
 16     FILE *data_a = fopen("data_a.txt", "wb");
 17 
 18     srand((unsigned)time(NULL));//产生随机数种子
 19     for(a = 0; a < num; a++)
 20     {
 21         memset(data, 0, sizeof(short)* BUFF);
 22         n = rand()%300;
 23         for(i = 0; i < n; i++)
 24         {
 25             j = rand()%BUFF;
 26             data[j] = 1;
 27         }
 28         fwrite(data, sizeof(short), BUFF, data_a);
 29     }

 30 }

datacpy.c的代码如下,实现上述二部门的功能说明

  1 #include <stdio.h>                                                                                                               
  2 #include <stdlib.h>
  3 #include <string.h>
  4 #include <time.h>
  5 
  6 #define BUFF 200*60
  7 #define FTELL(name) ftell(name)/sizeof(short)
  8 
  9 void main()
 10 {
 11     short int data[BUFF];//开辟一分钟的数据大小
 12     int i;
 13     int data_len;//读取整个文件data_a.txt的长度
 14     int m_len;//每次读取一分钟复制完毕后,文件从头到当前位置的长度  
 15     int m = 0;
 16     FILE * data_b = fopen("data_b.txt", "wb");
 17     FILE * data_a = fopen("data_a.txt", "rb");
 18 
 19     fseek(data_a, 0, SEEK_END);
 20     data_len = FTELL(data_a);
 21 
 22     fseek(data_a, m, SEEK_SET);
 23     while(1)
 24     {
 25         m_len = FTELL(data_a);
 26         if((data_len - m_len) >= BUFF)//如果剩余文件的长度大于BUFF的大小,正常按规律拷贝
 27         {
 28             memset(data, 0, sizeof(short)*BUFF);
 29             fread(data, sizeof(short), BUFF, data_a);

 30             
 31             //检测每次读取的一分钟的数据中记录最后出现1的位置
 32             for(i = BUFF; i > 0; i--)
 33             {
 34                 if(data[i-1] == 1)
 35                 {
 36                     break;
 37                 }
 38             }
 39             m = i;
 40         
 41             if(m > 1)//该数组中有存在1的数据的情况
 42             {
 43                 fwrite(data, sizeof(short), m, data_b);
 44                 fseek(data_a, -(sizeof(short)*(BUFF-m)), SEEK_CUR);
 45             }
 46             else//该数组中循环查询一遍没有找到出现1的数据的处理情况
 47             {
 48                 fwrite(data, sizeof(short), BUFF, data_b);
 49                 fseek(data_a, sizeof(short), SEEK_CUR);
 50             }
 51         }
 52         else//如果剩余文件的长度小于BUFF的大小,一下读完剩余数据即可
 53         {
 54             fread(data, sizeof(short), data_len-m_len, data_a);
 55             fwrite(data, sizeof(short), data_len-m_len, data_b);
 56             break;
 57         }  

 58     }
 59 
 60 }


以下是针对上述三部门陈述做的脚本文件data.sh的实现:

  1 #!/bin/bash                                                                                                                      
  2 gcc -o data_creat datacreat.c
  3 gcc -o data_cpy datacpy.c
  4 rm -f data_a.txt
  5 rm -f data_b.txt
  6 ./data_creat
  7 ./data_cpy
  8 md5sum data_a.txt
  9 md5sum data_b.txt
 

0 0