在实现小功能之前先说明文件的读写包括两种方式:
1. 二进制读写涉及到的函数如下:
fseek, ftell, fwrite, fread此些函数均以字节为单位;
2. ASCII码读写涉及的函数如下:
fgetc, fprintf, fscanf等,此种读写不会涉及文件的定位
以上两种的读写方法函数不能混淆使用;
下面是要实现的功能说明:
1 一. 准备数据,写入data_a.txt文件中
2 1.首先在0-300之间产生一个随机数A(即一分钟内的心率)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