文件操作相关函数总结

什么是文件

1.)程序文件:包括源程序文件(后缀为.c ),目标文件(windows 环境后缀为.obj ),可执行程序(windows 环境后缀为:.exe)。
2.)数据文件:文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。

文件名

一个文件要有一个唯一的文件标识,以便用户识别和应用。

文件名包括3部分:文件路径+文件名主干+文件后缀。
eg:“D:\Program Files (x86)\Tencent\QQ\Bin” 其中“D”是盘符,“\”是目录分隔符

文件类型

根据数据的组织形式,数据文件被称为文本文件或者二进制文件
数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件
例如:.mp4 .mov .exe …
如果要求在外存上以ASCII码的形式存储,则需要在存储前转换(读取时发生)。以ASCII字符的形式存储的文件就是文本文件
例如:.txt .h .c …

测试代码:

#include <stdio.h>
#include <windows.h>
#pragma warning (disable :4996)
int main()
{
 int a = 10000;
 FILE *pf = fopen("test.txt", "wb");
 fwrite(&a, 4, 1, pf);
 fclose(pf);
 pf = NULL;
 system("pause");
 return 0;
}
//在内存上写的是10 27 00 00 在文件中写入的依旧是10 27 00 00

fwrite函数介绍(二进制输出)

size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );
const void * ptr : 想把谁写进去
size_t size: 写的每个基本单位的大小
size_t count : 想写入几个基本大小
例如 int a[10]; size 可写4,count 可写10 。或者size写40,count写1
最终往文件写入的总的字节数是size*count
FILE * stream:指向某个文件文件的指针
fwrite 只能写二进制

文件缓冲区

系统自动在内存区为程序中每一个正在使用的文件开辟一个文件缓冲区从内存向磁盘输出数据,必须先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘。
如果从磁盘向计算机读入数据,则一次从磁盘文件将一批数据输入到内存缓冲区,然后再从缓冲区逐个地将数据送到程序数据区。
测试代码

printf("hello  world!\n");
 Sleep(3000);
 int a;
 scanf("%d", &a);

文件数据缓冲方式:
1)无缓冲
2)行缓冲(printf往显示器上打 )没有写满缓冲区
3)全缓冲:写满缓冲区才刷(效率最高)
跟外设打交道次数越少,效率越高

文件指针

1)一个程序启动时,我们通常把文件指针FILE* 也可以称之为在文件当中打开一个流。打开一个文件就是打开一个流。文件指针(句柄)。
2)任何一个程序启动时,默认会打开3个流,分别是stdin(标准输入),stdout(标准输出),stderr(标准错误)。
3)这三个流分别对应 键盘,显示器,显示器
extern FILE *stdin
extern FILE *stdout
extern FILE *stderr
测试往显示器上写:

const char *msg = "hello world!";
 fwrite(msg,strlen(msg),1,stdout);

FILE在C语言中是一个结构体,FILE *是一个结构体指针,FILE里面包括了最基本的一些特性,尤其是文件属性相关的。
每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构体的变量,并填充其中基本信息。
一般都是通过一个FILE的指针来维护这个FILE结构的变量。
FILE *fp;//文件指针变量
FILE *pf = fopen(“test.txt”, “wb”);
/ /当fopen调完时,FILE *指向这个结构体。这个结构体由fopen定义。

fopen

FILE * fopen ( const char * filename, const char * mode );
const char * filename:带或不带路径的文件,该文件可以存在也可以不存在。不存在时以’w’方式时,会自动创建。以’r’方式时,会报错

fclose

由于不可能在栈上申请结构体,类似malloc,申请完结构体后,返回结构体指针。所以必须有类似free的操作,即int fclose ( FILE * stream );

文件使用方式

*path:字符串包含欲打开的文件路径及文件名(例如:D:\A.txt),注意在C语言中欲输出一个"“则需要输两个”\"
*mode:代表着流形态,mode有下列几种形态字符串:
r 打开只读文件,该文件必须存在。
r + 打开可读写的文件,该文件必须存在。
rb + 读写打开一个二进制文件,只允许读写数据。
rt + 读写打开一个文本文件,允许读和写。
w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
w + 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)
a + 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。(原来的EOF符不保留)
wb 只写打开或新建一个二进制文件;只允许写数据。
wb + 读写打开或建立一个二进制文件,允许读和写。
wt + 读写打开或着建立一个文本文件;允许读写。
at + 读写打开一个文本文件,允许读或在文本末追加数据。
ab + 读写打开一个二进制文件,允许读或在文件末追加数据。
上述的形态字符串都可以再加一个b字符,如rb、w + b或ab+等组合,加入b 字符用来告诉函数库打开的文件为二进制文件,而非纯文字文件。

文件的顺序读写

fputc
int fputc ( int character, FILE * stream );
int character: 想写入的字符
FILE * stream: 想写到哪个流中去
测试代码(往显示器上写):

fputc('c',stdout);
#include <errno.h>
FILE *fp =fopen("log.txt","w");
if(NULL==fp)
{
printf("%d:%s",errno,strerror(errno));
return 1;
}
fputc('c',fp);
fclose(fp);

fgetc
int fgetc ( FILE * stream );

fputs
int fputs ( const char * str, FILE * stream );
往显示器上打字符串:
fputs(“hello world\n”,stdout) //往文件里写不会把’\0’写进去

FILE *fp = fopen("test.txt", "w");
 if (NULL == fp)
 {
  printf("%d:%s\n", errno, strerror(errno));
  system("pause");
  return 1;
 }
 printf("%d\n", ftell(fp));
 fputs("hello world\n", fp);  //编译器会自动把‘\n’识别成‘\r\n ’
 printf("%d\n", ftell(fp));

fprintf
int fprintf ( FILE * stream, const char * format, … );
const char * format:字符指针
… :在C语言中表示可变参数
与printf比较
int printf ( const char * format, … );
代码测试:
往显示器上打:
fprintf(stdout,“hello world: %d\n”, x);
往文件中打:

 FILE *fp = fopen("test.txt", "w");
 if (NULL == fp)
 {
  printf("%d:%s\n", errno, strerror(errno));
  system("pause");
  return 1;
 }
 int x = 1000;
 fprintf(fp,"hello world: %d\n", x);
```.
**fcsanf**  
默认从stdin读取
int fscanf ( FILE * stream, const char * format, ... );
 FILE *fp = fopen("test.txt", "r");
 if (NULL == fp)
 {
  printf("%d:%s\n", errno, strerror(errno));
  system("pause");
  return 1;
 }
 int x = 0;
 fscanf(fp,"hello world: %d\n", &x);//从文件里读取
 printf("%d\n",x);
**sprintf**
int sprintf ( char * str, const char * format, ... );//往字符串里面写
任何一个数字加上字符'\0'是其对应的字符
代码测试:
整型转字符串

int x = 1234;
char buf[16];
sprintf(buf, “%d”, x); //以%d的形式往显示器上打印,但是显示器上显示的是字符


字符串转整型:
int x = 0;
 char buf[16]="1234";
 sscanf(buf, "%d", &x);//从缓冲区里读取
 
## fseek
int fseek ( FILE * stream, long int offset, int origin );

文件的随机读写。fseek可以通过修正文件的读写位置和偏移量来指定向文件的特定位置去写。
没有写入的能力,唯一的能力是指定文件的位置。
fseek本质改文件的属性。
SEEK_SET   文件开头
SEEK_CUR  文件指针当前的位置
SRRK_END 文件结束
## ftell
long int ftell ( FILE * stream );  //long int 就是long  占4个字节

告诉我们当前读写的位置在哪里。返回的也是文件的属性。
成功后,返回位置指示器的当前值。            
 失败时,返回-1L,并将errno设置为系统特定的正值。 

# rewind
void rewind ( FILE * stream );

将当前文件的写入位置,回归到文件的最开始
测试代码:

int a = fgetc(fp);
printf("%c\n", a);
printf(“before pos: %d\n”, ftell(fp));
rewind(fp);
printf(“after pos: %d\n”, ftell(fp));
int a = fgetc(fp);
printf("%c\n", a);
printf(“before pos: %d\n”, ftell(fp));
rewind(fp);
printf(“after pos: %d\n”, ftell(fp));


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值