一、文件操作基本知识
c语言文件的操作分 "读"和“写”
1.读 指的是:将文件内的信息写入到程序,可以理解为
硬盘信息->内存信息 的转化方式
2.写指的是:将程序中的信息写入到文件,如txt文件。是一种
内存信息->硬盘信息 的转化方式
二、具体使用方法
1.定义文件变量
在C语言中,读文件的需要用到文件类型 FILE;
通常的使用方式为: FILE *fp; 定义一个文件指针;
2.打开一个文件
用指针打开文件的函数为:fp = fopen("mm.txt","w"));
w也可以是r,对应两种使用方式:w(write),r(read)。
如果是将信息写入文件,则是w。
若是将文件信息写入程序,则是r。
在r的方式时,即读文件的方式时,若打开的文件不存在,则会打开失败。
在w的方式时。即在写进文件的,比如将信息写入“cc.mm”这么一个文件里时,程序发现并没“cc.mm”那么一个文件,则会自动创建一个新文件 命名为“cc.mm”,将信息写入其中。注意!后缀名 .xx、.tet、.什么都无所谓,都默认按txt的方式写入。
3.函数的调用
文件的读取函数为:fwrite(p, sizeof(XX), 1, fp);
即将文件内的信息,按XX大小的内存(类型)写入指针P当中。通过函数调用之后,fp即文件指针自动后移。
文件写入的函数为:fprintf(fp,"%x",p );
即将p指针里的信息按照%x的格式写入文件中。
4.在最后一定要记得使用fclose(fp)!!!!关闭文件指针
三、示例
1.文件的写入
#include <string.h>
#include <windows.h>
#define NEW (TX *)malloc(sizeof(TX))
typedef struct tongxunlu //定义的一个通讯录的结构体
{
char number[10]; //号码
char name[20]; //姓名
int old; //年龄
char address[20]; //地址
char phone[12]; //电话
struct tongxunlu *next;//链表
}TX;
int main ()
{
FILE *fp; // 文件指针fp
TX *p;
int i,n; // i,n控制循环
if((fp = fopen("学生信息.txt","w")) == NULL ) // 打开文件
{
printf(" 人品 不够!!启动失败!!!\n");
exit(0);
}
printf("输入人数:"); // 键盘输入人数n
scanf("%d",&n);
fprintf(fp,"%d",n); // 将人数n写入文件
fprintf(fp,"\n");
p = NEW; // 开辟一个新内存,并让指针p指向它
printf(" 输入档案号、姓名、年龄、籍贯、联系电话\n");
for(i = 0; n > i ; i++) // 反复用同一个节点进行n次循环
{
scanf("%s",&p -> number); // 键盘将数据写入该节点
scanf("%s",&p -> name);
scanf("%d",&p -> old);
scanf("%s",&p -> address);
scanf("%s",&p -> phone);
fprintf(fp,"%s ",p -> number); // 将该节点内的数据写入文件
fprintf(fp,"%s ",p -> name);
fprintf(fp,"%d ",p -> old);
fprintf(fp,"%s ",p -> address);
fprintf(fp,"%s ",p -> phone);
fprintf(fp,"\n");
}
free(p); // 释放p内存
fclose(fp); // 关闭文件
printf("\n\n数据输入完成\n");
}
2.文件的读取
TX *setTX()
{
FILE *fp; // 文件指针fp用来打开文件
TX *head, *p, *q; // 结构体指针,用来建立链表
int i,n; // 整形i,n控制循环
if((fp = fopen("学生信息.txt","r")) == NULL ) // 用只读的方式打开文件
{
printf(" 现无数 据请先输入数据!!!\n");
exit(0);
}
fscanf(fp,"%d",&n); // 从文件读取人数n
head = NEW; // 给头结点head开辟一段内存
p = head ;
for (i = 0;i < n ;i++) // for循环,进行n次构建节点
{
q = NEW ;
p -> next = q;
fscanf(fp,"%s",&q -> number); // 将文件内的数据写入节点
fscanf(fp,"%s",&q -> name);
fscanf(fp,"%d",&q -> old);
fscanf(fp,"%s",&q -> address);
fscanf(fp,"%s",&q -> phone);
p = q;
}
q -> next = NULL; // 尾节点指向NULL
fclose(fp); // 关闭文件
return head; // 返回所建立的链表的头结点
}