文件

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*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值