文件的读写
来源:互联网 发布:知识管理 知乎 编辑:程序博客网 时间: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
- 串口的读写,文件读写
- INI文件的读写
- 读写文件的例子
- INI文件的读写
- 关于文件的读写
- 文件的读写操作
- 文件的读写操作
- properties文件的读写
- 读写服务器端的文件
- 位图文件的读写
- C++文件的读写
- ini文件的读写
- 文件的读写
- 自定义文件的读写
- 文件的读写操作
- 文件的读写
- 文件读写的问题
- Python文件的读写
- phpmyadmin导入.sql数据库文件报错解决
- iOS8 遇到的问题
- PYTHON CHALLENG warming up
- HDU 5037 Frog(北京网络赛F题)
- love2d 学习笔记1
- 文件的读写
- PHP加减乘除运算
- session相关
- Spring控制器响应(action)请求的几种处理方式,如返回JSON,MODEL MODELVIEW,STRING
- hdu 5035 Delivery 概率题 2014 ACM/ICPC Asia Regional Beijing Online
- hdu 5023——A Corrupt Mayor's Performance Art
- hive导入数据到hbase
- qt实现的窗口吸附屏幕边缘,动画隐藏显示的效果,类似于qq主窗口 吸附 隐藏的效果
- HDU 5038 Grade(北京网络赛G题)