1. fopen打开文件路径问题
FILE *fp = fopen("D:\\quick_sort.c", "r");
FILE *fp = fopen("/home/quick_sort.c", "r");
Windows上的路径分隔符是反斜杠(\),C语言中反斜杠被用作转义字符,因此需要使用两个反斜杠(\)来表示一个路径分隔符
Linux上的路径分隔符是正斜杠(/),不需要进行转义,直接使用即可
2. fgetc函数
getc 函数的作用是从 FILE* 指针指向的文件中读取 1个字符
int getc(FILE *stream);
FILE *stream 参数 : 要读取字符的文件 ;
int 返回值 : 读取到的字符返回 int 类型值 ;
如果要读取文件中的内容 , 需要循环逐个字节读取 ;
文件结尾标识符是 EOF
#define EOF (-1)
在文件内部有一个位置指针,用来指向当前读写到的位置,也就是读写到第几个字节。在文件打开时,该指针总是指向文件的第一个字节。使用 fgetc() 函数后,该指针会向后移动一个字节,所以可以连续多次使用 fgetc() 读取多个字符。
3. 文件拷贝
FILE *src=fopen("源文件路径","r");
FILE *des=fopen("目的文件路径","w+");
char ch;
while((ch=fgetc(src))!=EOF)
{
fputc(ch,des);
}
fclose(src);
fclose(des);
4. 处理大量重复代码方式——预定义宏
#define F_PRINT_ERR(e)\
do\
{\
if(e == NULL)\
{\
printf("open error");\
exit(-1);\
}\
}\
while(0)\
存在大量重复性代码,可以封装成函数或者宏来处理,F_PRINT_ERR(e)
5. rewind函数
rewind(FILE *file);//将文件的光标移动到文件的最前面
6. feof函数
//feof()函数:如果读取操作已尝试读取超过文件末尾的值, feof 函数将返回非零值;否则返回0
//会导致多读一次字符,标志位检测滞后导致
char ch;
while(!feof(pf))
{
ch = fgetc(pf);
printf("%x->%c\n" ,ch,ch);
}
//完善feof函数的写法,先读数据在做判断
char ch;
while( (ch = fgetc(pf)) && !feof(pf))
{
printf("%x->%c\n",ch,ch);
}
//一般写法
while(( ch = fgetc(pf))!= EOF)
{
printf("%x->%c \n",ch,ch);
}
7. 不同系统换行问题
linux:
0a //换行
windows:
0d0a //换行
写入文件时是0a的写入代表换行
读出换行的时候是一个字符0a换行
但是直接用字符显示文件内容实质是0d0a
但是如果将window下面的文件放到Linux里面去读,那么读取到的换行是0d0a两个字符
8. 文件分类
大家都知道计算机的存储,物理上是二进制的,所以文本文件与二进制文件的区别并不是物理上的,而是逻辑上的。这两者只是在编码层次上有差异。简单来说,文本文件是基于字符编码的文件,常见的编码有ASCII编码,二进制文件是基于值编码的文件。
文本文件:以 ASCIl码格式存放,一个字节存放一个字符。文本文件的每一个字节存放一个ASCII码,代表一个字符。这便于对字符的逐个处理,但占用存储空间较多,而且要花费时间转换。
二进制文件:以值(补码)编码格式存放。二进制文件是把数据以二进制数的格式存放在文件中的,其占用存储空间较少。数据按其内存中的存储形式原样存放。
数值存入文件:short int a=10000;
字符存入文件:
9. FILE结构体
typedef struct {
short level; /*缓冲区满/空程度*/
unsigned flags; /*文件状态标志*/
char fd; /*文件描述符*/
unsigned char hold; /*若无缓冲区不读取字符*/
short bsize; /*缓冲区大小*/
unsigned char *buffer; /*数据传送缓冲区位置*/
unsigned char *curp; /*当前读写位置*/
unsigned istemp; /*临时文件指示*/
short token; /*用作无效检测*/
}FILE;/*结构体类型名FILE*/