本帖最后由 关键是感觉 于 2018-6-20 14:13 编辑 #include "stdio.h"
#include "stdlib.h"
#include "malloc.h"
typedef struct sTest{
int Data; //这里为了演示简单,直接创建了int类型变量作为数据域,其实最好到方法是创建一个结构体数据域
struct sTest * next;
}sTest;
typedef struct sHead{ //根据大佬讲解,这样比较方便管理链表,比书中讲解的直接在全局创建比较好
sTest * p_head;
//好处可以记录链表状态,比如最后结点位置,最大值,最小值,你能想到的任何东西
//sTest * p_tail;
//int max;
//int min
}sHead;
sHead * inital(){
sHead * t= (sHead * )malloc(sizeof(sHead));
if(!t) exit(-1); //创建失败直接退出
t->p_head=NULL; //初始化
return t; //返回指针
}
void add(sHead * p,int n){
sTest *swap=(sTest * )malloc(sizeof(sTest));//因为是头部插入,所以最后申请到空间永远在头部
swap->Data=n;
swap->next=p->p_head; //头部插入
p->p_head=swap;
}
void save(sHead * p){
sTest *t=p->p_head;
FILE * pf = fopen("d.data","wb");
if(pf){
while(t){
fwrite(&t->Data,sizeof(t->Data),1,pf);
t= t->next;
}
fclose(pf);
}
}
void read(sHead * p){
FILE * pf = fopen("d.data","rb");
if(pf){
int Data;
int h;
while(h = fread(&Data,sizeof(Data),1,pf)){
add(p,Data);
}
fclose(pf);
}
}
/*
上面都是链表知识,
文件读取和保存,
文件操作,先来一个死记硬背的理解,
r 打开一个已有的文本文件,允许读取文件。
w 打开一个文本文件,允许写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会从文件的开头写入内容。如果文件存在,则该会被截断为零长度,重新写入。
a 打开一个文本文件,以追加模式写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会在已有的文件内容中追加内容。
r+ 打开一个文本文件,允许读写文件。
w+ 打开一个文本文件,允许读写文件。如果文件已存在,则文件会被截断为零长度,如果文件不存在,则会创建一个新文件。
a+ 打开一个文本文件,允许读写文件。如果文件不存在,则会创建一个新文件。读取会从文件的开头开始,写入则只能是追加模式。
如果处理的是二进制文件可以在模式后面添加b
文字那么多其实就三个字母:r w a
r就是可以读文件,不存在就读取失败
w写文件,不存在创建文件,存在文件,覆盖文件
a如果在一个文件追加内容,w肯定不行,r是读,所以有了a模式,不存在创建,存在追加信息
+其实就是rwa的加强版,让r可读可写,r+ w+ a+ 类型
b其实以什么方法操作文件 二进制
t其实以什么方法操作文件 文本模式
网上收集:b是二进制模式,是一种通用的文件读取模式,因为所有的文件在硬盘中都是以二进制形式存放的 *** 就是通用的
二进制 I/O 函数
下面两个函数用于二进制输入和输出: 二进制模式操作
size_t fread(void *ptr, size_t size_of_elements,
size_t number_of_elements, FILE *a_file);
size_t fwrite(const void *ptr, size_t size_of_elements,
size_t number_of_elements, FILE *a_file);
*/
void print(sHead * p){
sTest *t=p->p_head;
while(t){
printf("%d\t",t->Data);
t= t->next;
}
}
void _ferr(sHead * p){
sTest *t=p->p_head;
while(t){
sTest *t_free = t;
t =t->next;
free(t_free);
}
}
int main(int argc, char *argv[]){
sHead * head;
int i;
head = inital();
read(head);
for(i=0;i<10;i++){
add(head,i);
}
print(head);
save(head);
_ferr(head);
free(head);
//停下手上的测试帮楼主。。。
return 0;
}
代码没有几行,就是注释比较多 |