C语言文件操作
打开文件
FILE *fp = fopen("要点一","要点二");
要点一:
- 这里可以写单独的文件名,比如说“1.txt”,那么他就会在当前c文件的文件夹目录下查询文件是否存在,存在则返回这个文件的指针,不存在的话则返回NULL,
- 这里也可以写一个文件的绝对路径,比如说“C:\aaa\ccc\a.txt”这样的话他就会在整个电脑里面找这个路径是否存在该文件,存在则返回文件指针,不存在则返回NULL
要点二:
这里写的是打开文件之后想要操作的类型主要的类型我查了一下,有如下几种
- “r”.为读而打开文本文件.(不存在则出错)
- “w”.为写而打开文本文件.(若不存在则新建,反之,则从文件起始位置写,原内容将被覆盖)
- “a”.为在文件后面添加数据而打开文本文件.(若不存在,则新建;反之,在原文件后追加)
“r+”.为读和写而打开文本文件.(读时,从头开始;在写数据时,新数据只覆盖所占的空间,其后不变)
“wb”.为写而打开二进制文件.
- “rb”.为读而打开二进制文件
- “ab”.为在文件后面添加数据而打开一个二进制文件.
“rb+”.为读和写而打开二进制文件.只是在随后的读写时,可以由位置函数设置读和写的起始位置.
“w+”.首先建立一个新文件,进行写操作,随后可以从头开始读.(若文件存在,原内容将全部消失)
- “a+”.功能与”a”相同;只是在文件尾部添加新的数据后,可以从头开始读.
- “wb+”.功能与”w+”同.只是在随后的读写时,可以由位置函数设置读和写的起始位置.
“ab+”.功能与”a+”相同;只是在文件尾部添加新数据之后,可以由位置函数设置开始读的起始位置.
将数据存入文件(写文件)
几种操作函数
- fputc(FILE* fp,int c);//将一字节数据写入文件,写入成功返回c,失败则返回-1
- fputs(const char* a,FILE* fp);将字符数组的指针或者动态申请的数组头指针指向的数据写入文件,写入成功则返回这个数组的头指针
fprintf(FILE* fp,const char* c,….);比printf多了一个文件指针的形参,所以说这个函数不是讲数据输出到黑色控制台的,而是输出到文件中
FILE *fp = fopen("1.txt","w"); fputc('a',fp);//写字符函数,写成功则返回该字符,否则返回-1 char b[10] = "1111111"; fputs(b,fp);//放置一个字符数组在文件中,其中,这个数组的长度是必须清楚的,因为这在读文件的时候会用到 fprintf(fp,"%d",15);将15输出到文件
通常我感觉大概新手的话就用到这三个
注意事项:- 因为写入字符串长度的不稳定性,我这里想了个办法,就是提前把他的长度写进去,在读的时候将他的长度知道之后就可以读到正确的字符串了(关于读字符串后面会说)
- 在写数字的话可以用%10d这样的方式去写,这里的数字是绝对大于你往文件里写的那个数字的长度的,这样你在的时候就可以直接读这么长的空间,读到的数字基本上一定是正确的
关闭文件指针
写完之后一定莫忘关闭文件指针
fclose(fp);
读取文件中的数据
对应前面的三个函数,这里也同样三个函数来读取文件中的数据
- fgetc(FILE* fp);//从文件读取一字节数据以返回值的形式返回出来
- fgets(const char* a,int n,FILE* fp);比写数据多了一个整数,这个整数代表你要读取的字符个数,这个也是我之前说的你必须记住你往里面写入的字符数组的字符个数
- fscanf(FILE* fp,const char* c,….);比scanf()多了一个文件指针的形参,所以说这个函数不从黑色控制台读取的,而是从文件中读取数据
FILE *fp = fopen("1.txt","r");
char a[10];
a[0] = getc(fp);//读取一字节数据
printf("%c\n",a[0]);
fgets(a,8,fp);//读取八个字符
puts(a);
int c;
fscanf(fp,"%5d",&c);//读取一个5长度的空间,读取这个空间上的整数
printf("%d\n",c);
注意事项:
- 读取的顺序一定与写的时候的顺序相同
- ###关闭文件指针
读完之后一定莫忘关闭文件指针
fclose(fp);
其他相关操作
直接操作结构体
typedef struct node{
int a;
}Node;
Node *a = {1};
//size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);
//fwrite(数据类型指针,数据类型大小,写入的数据类型个数,文件指针);
fwrite(a,sizeof(Node),1,fp);//将结构体直接写入文件
//size_t fread (void *buffer,size_t size,size_t count,FILE *stream);
//fread(a,sizeof(Node),1,fp);//从文件中读取一个类型的结构体
目前我用到的基本上就这么多,最后给大家贴上一段我用过的最后两个函数的示例代码
//保存链表数据到文件
void savedata(Node* head){
FILE *fp = fopen("car.txt","w");
head = head->next;
while(head){
fwrite(&head->car_data,sizeof(head->car_data),1,fp);
head = head->next;
}
fclose(fp);
}
//从文件读取数据并存放到链表
void initdata(Node* head){
FILE *fp = fopen("car.txt","rt");
Node *temp = head;
Node *p = (Node*)malloc(sizeof(Node));
while(fread(&p->car_data,sizeof(p->car_data),1,fp) == 1){
temp->next = p;
p->next = NULL;
temp = temp->next;
p = (Node*)malloc(sizeof(Node));
}
free(p);
fclose(fp);
}
注意事项
- 以上代码的&p->car_data的原因是
typedef struct car{
char car_model[10];
int car_number;
int car_sales_price;
int car_purchasing_price;
int car_sales_number;
}Car;
typedef struct Node{
struct car car_data;
struct Node *next;
}Node;
我在一个链表结点中只保留两项数据,一项是我的数据结构体,一项是指针域这样我如果定义Node * p = (Node*)malloc(sizeof(Node));那么p->car_data只是得到这个结构体,而两个函数要的都是类型指针,所以我对他再进行取地址操作
写完了,大概新手用到的就是这些吧,大家有什么问题或者我哪里写的有问题欢迎评论,谢谢!不喜勿喷
更多推荐
c语言关于文件操作的常用函数(新手入门看)
发布评论