• C学习笔记-文件操作


    文件操作大致分三步

    1. 打开文件
    2. 读写文件
    3. 关闭文件

    二进制和文本模式的区别

    • 在windows系统中,文本模式下,文件以" "代表换行。若以文本模式打开文件,并用fputs等函数写入换行符" "时,函数会自动在" "前面加上" "。即实际写入文件的是" " 。
    • 在类Unix/Linux系统中文本模式下,文件以" "代表换行。所以Linux系统中在文本模式和二进制模式下并无区别
    • 对于GBK编码的汉字,一个汉字两个字节,对于utf8来讲一个汉字3个字节,但如果英文字母都是一个字节

    fopen

    FILE *p = fopen("a.txt", "r");
    

    第一个参数指定打开的文件名,第二个参数指定打开方式
    返回值如果是NULL,代表打开失败,打开成功返回文件流
    关于第二个参数的说明如下:
    r:以只读方式打开文件,该文件必须存在。
    r+:以可读写方式打开文件,该文件必须存在。用r+写文件时候,从文件开始位置写入
    rb+:读写打开一个二进制文件,允许读写数据,文件必须存在。
    rw+:读写打开一个文本文件,允许读和写。
    w:打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
    wb
    按照二进制格式写文件,在windows下不会自动添加' 'wb:只对windows有效,对于linux而言,w与wb效果相同。
    w+:打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
    a:以附加的方式打开只写文件。若文件不存在,则会建立该文件,行为和w是一样,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)
    a+:以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。 (原来的EOF符不保留)
    b:只对windows有效,对于unix来讲是无效

    fclose

    fclose关闭fopen打开的文件

    fclose(p);
    

    getc和putc

    getc从文件中读取一个字符

    int main()
    {
    	FILE *fp = fopen("a.txt", "r");
    	char c;
    	while ((c = getc(fp)) != EOF)
    	{
    		printf("%c", c);
    	}
    	fclose(fp);
    	return 0;
    }
    

    putc向文件中写入一个字符

    int main()
    {
    	FILE *fp = fopen("a.txt", "w");
    	const char *s = "hello world";
    	int i;
    	for (i = 0; i < strlen(s); i++)
    	{
    		putc(s[i], fp);
    	}
    	fclose(fp);
    	return 0;
    }
    

    EOF与feof函数文件结尾

    对于一个文件来说,文件的结尾是EOF

    char c = 0;
    while((c = getc(p)) != EOF)
    {
        printf("c = %c
    ", c);
    }
    

    feof用作判断文件是否读完,如果已经到文件结尾,返回true

    FILE *p1 = fopen("a.txt", "r");
    FILE *p2 = fopen("b.txt", "w");
    char buf[1024] = { 0 };
    while(!feof(p1))
    {
        fgets(buf, sizeof(buf), p1);//读取一行文件
        fputs(buf, p2);
    }
    fclose(p1);
    fclose(p2);
    

    fprintf,fscanf,fgets,fputs

    这些函数都是通过FILE *来对文件进行读写
    printffprintfsprintf有何关系?
    三者都是格式化输出函数,不同的是输出的对象不一样
    printf向标准输出设备输出

    printf("%s", "test");
    

    sprintf向字符串输出

    char buf[1024] = { 0 };
    sprintf(buf, "%s", "test");
    

    fprintf向文件输出,严格输入,不会添加' '

    FILE *p = fopen("a.txt", "w");
    fprintf(p, "%s", "test");
    

    fscanf从文件读取,如果在一行中遇到空格便结束读取本行读取

    FILE *p = fopen("a.txt", "r");
    char buf[1024] = { 0 };
    fscanf(p, "%s", buf);//读取到的存入buf
    

    fgets函数每次读取一行,有三个参数,第一个参数代表临时存储位置,第二个参数代表大小,第三个代表读取位置

    fgets(buf, sizeof(buf), p);
    

    fputs函数每次写入一行,有两个参数,第一个参数是临时存储位置,第二个是写入位置

    fputs(buf, p);
    

    fscanf不会读取行尾的' 'fgets会将行尾的' '读取到buf里面
    不论fprintf还是fputs都不会自动向行尾添加 ,需要代码中往buf的行尾写 才可以达到换行的目录

    stat

    头文件包含:#include <sys/stat.h>
    函数的第一个参数代表文件名,第二个参数是struct stat结构地址

    struct stst st;
    memset(&st, 0, sizeof(st));
    stst("a.txt", &st);
    

    得到文件的属性,包括文件建立时间,文件大小等信息

    fseek

    函数设置文件指针stream的位置。如果执行成功,stream将指向以fromwhere为基准,偏移offset(指针偏移量)个字节的位置,函数返回0。如果执行失败则不改变stream指向的位置,函数返回一个非0值
    超出文件末尾位置,还是返回0。往回偏移超出首位置,还是返回0
    第一个参数stream为文件指针
    第二个参数offset为偏移量,单位:字节,正数表示正向偏移,负数表示负向偏移
    第三个参数origin设定从文件的哪里开始偏移,可能取值为:SEEK_CUR(当前位置)、SEEK_END(文件结尾)或 SEEK_SET(文件开头)

    fseek(fp, 3, SEEK_SET);
    

    ftell

    函数 ftell 用于得到文件位置指针当前位置相对于文件首的偏移字节数。在随机方式存取文件时,由于文件位置频繁的前后移动,程序不容易确定文件的当前位置

    long len = ftell(fp)
    

    fgetpos和fsetpos

    fgetpos和fsetpos是ftell和fseek的加强版
    fseek与ftell返回的是long类型,如果文件很大,超过long的范围,那么该函数会有问题,fgetpos与fsetpos函数可以处理更大的文件类型
    返回值:成功返回0,否则返回非0

    fpos_t ps = 0;
    fgetpos(fp, &ps);
    
    fpos_t ps = 2;
    fsetpos(fp, &ps);
    

    fflush

    只有调用了fclose之后,所有的写入操作才真实的把内容写入文件
    所有的C库函数文件读写操作都是针对缓冲区进行的,并不是真实的文件
    缓冲区写满以后,写入缓冲区
    fflush函数可以将缓冲区中任何未写入的数据写入文件中。

    fflush(p);//实时写入到文件中去
    

    修改配置文件,希望修改实时生效,那么每次修改完成之后我们fflush一次

    fread和fwrite

    fread和fwrite以二进制形式对文件进行操作,不局限于文本文件

    size_t fread(void *buffer, size_t size, size_t count, FILE *stream);
    
    size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);
    

    返回值:返回实际写入或读取的数据块数目
    只要读取到文件最后,没有完整的读取一个数据块出来,fread就返回0
    第一个参数代表void *,写入或者读取的缓冲区
    第二个参数是代表写入或读取的时候一个单位的大小
    第三个参数是代表写入或读取几个单位
    第四个参数是FILE *

    char buf[1024] = { "test" };
    fwrite(buf, strlen(buf), 1, p);
    

    fread与feof的注意点

    fopen读到文件末尾,并不立即返回真,再调用一次才会返回真

    while (!feof(p))
    {
    	fread(&buf, 1, sizeof(buf), p);
    }
    
    while (fread(&buf, 1, sizeof(buf), p))
    {}
    
  • 相关阅读:
    FZU 2129 子序列个数(DP)题解
    FZU 2082 过路费(树链剖分 边权)题解
    2019牛客多校第一场E ABBA(DP)题解
    ajax解决csrf的跨站请求伪造
    django实现简单的跨域请求数据
    python 与jQuery之间的接口对应
    GO语言的初次学习
    Django一些常用参数的设置
    auth认证模块
    Django中间件模块的使用
  • 原文地址:https://www.cnblogs.com/cj5785/p/10664783.html
Copyright © 2020-2023  润新知