标准C语言---------对文件的操作

Source
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/Y_skepticism/article/details/99607443

文件分类:

文本文件:记录的是字符串的二进制

二进制文件:直接把数据补码记录到文件中
磁盘只能存储二进制数据。

文件文件中存储的是ASCII码的二进制,先把数据转换成字符中,
再写入到文件中,可以直接被文本编辑器打开。

二进制文件中存储的数据的二进制,直接把数据的二进制存储到文件中,
无法直接通过文件编辑器查看。

文件I/O函数:

FILE *fopen(const char *path, const char *mode);

功能:打开或创建文件
path:文件的路径(可以是相对路径,也可以是绝对路径)
mode:文件的打开方式
    "w" 以只写权限打开文件,如果文件不存在则创建,存在则清空文件的内容。
    "w+" 在"w"的基础上增加读取权限。
    "r" 以只读权限打开文件,如果文件不存在则打开失败。
    "r+" 在"r"的基础上增加写取权限
    "a" 以只写权限打开文件,如果文件不存在则创建,存在保留原内存,新写入的数据会追加到文件末尾。
    "a+" 在"w"的基础上增加读取权限。
    "b" 不能单独使用,而是与"wra"配合使用,表示打开的是二进制文件,对于Linux系统而说没什么用。
    在Windows系统下:
        "b"表示操作的是二进制文件 \n 直接写入 \n。
        不加"b"表示操作的是文本文件,\n 会被写入 \n\r。
返回值:返回的是一个结构体指针,不需要操作结构的成员,只需要反它当作一个令牌即可,用来区别所操作的文件,如果文件打开失败返回值为NULL。

int fprintf(FILE *stream, const char *format,…);

功能:以文本形式写入数据
stream:文件指针,fopen函数的返回值
format:占位符
...:变量名
返回值:成功写入字节的个数

int fscanf(FILE *stream, const char *format, …);

功能:从文件中以文本形式读取数据到变量
stream:文件指针,fopen函数的返回值
format:占位符
...:变量的地址
返回值:成功读取到的变量的个数

size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);

功能:把数据的二进制写入到文件中
ptr:要写入的数据的首地址
size:写入的字节数
nmemb:写入的次数
stream:文件指针,fopen的返回值
返回值:成功写入的次数

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

功能:从文件中以二进制的形式读取数据到内存中
ptr:读取数据后的存储位置
size:每次读取的字节数
nmemb:读取的次数
stream:文件指针,fopen的返回值
返回值:成功写入的次数

fread(&stu,1,sizeof(stu),frp);

文件位置指针:

每一个打开文件系统都会用一个变量记录文件的读写的位置。
使用w、r打开的文件位置指针都在文件的开头,而使用a打开的文件,位置指针都在末尾。
位置指针会随着数据的读写而变化。

int fseek(FILE *stream, long offset, int whence);

功能:设置文件的位置指针,位置指针会设置到 基础位置+偏移值
stream:文件指针
offset:偏移值
whence:基础位置
    SEEK_SET 文件开头
    SEEK_CUR 当前位置
    SEEK_END 文件末尾
返回值:调用后的文件位置指针(整数,字节数)。

long ftell(FILE *stream);

功能:获取文件的位置指针,位置指针当前所在的字节数

void rewind(FILE *stream);

功能:把文件的位置指针,调整到开头。

int fclose(FILE *fp);

功能:关闭文件
当数据写入后并没有立即同步到磁盘中,而存储在缓冲区中,只有满足一些条件时才会从缓冲区中写入到磁盘中。
1、从输出调整到输入。
2、缓冲区满4k
3、文件关闭
4、程序结束
5、手动刷新 int fflush(FILE *stream);

默认打开的文件指针:

    stdin 标准输入
    stdout 标准输出
    stderr 标准错误

结构体序列化和反序列化:
体序列化:结构变量转换成字符串

int sprintf(char *str, const char *format, …);

    功能:把一些变量按照格式合并成一个字符串
    format:占位符
    ...:变量名
    返回值:合并后的字符串长度

为什么要进行序列化:

        1、为了方便数据库操作
        2、方便网络传输
        3、文件读写

反序列化:字符串转换成结构体

int sscanf(const char *str, const char *format, …)

    功能:从字符串中读取数据到变量
    str:待读取数据的字符串
    format:占位符
    ...:变量地址
    返回值:成功读取的变量数

main函数的参数:

main的参数可以让程序从命令行执行时附加一些字符串,
如:执行系统命令时附加的参数就是以参数使用实现的。
ls -l
touch filename
int main(int agrc,char* argv[])
{
    agrc:字符串的数量
    argv:存储字符串的指针数组
}

int access(const char *pathname, int mode);

功能:检查文件的权限
pathname:文件路径
mode:
    F_OK 检查文件是否存在
    R_OK 检查文件是否有读权限
    W_OK 检查文件是否有写权限
    X_OK 检查文件是否有执行权限
返回值:成功返回0,失败返回-1