C语言基础(十一)- 文件和目录操作运算

C\C++关于FILE结构定义说明

//此结构VC定义于stdio.h头文件中,
struct _iobuf { 
     char   *_ptr;      //文件输入的下一个位置 
     int    _cnt;       //当前缓冲区的相对位置 
     char   *_base;     //指基础位置(应该是文件的其始位置) 
     int    _flag;      //文件标志 
     int    _file;      //文件的有效性验证 
     int    _charbuf;   //检查缓冲区状况,如果无缓冲区则不读取 
     int    _bufsiz;    //文件的大小 
     char   *_tmpfname; //临时文件名 
};
typedef   struct   _iobuf   FILE; 


文件的打开、关闭、以及简单读写


# include <stdio.h>
# include <stdlib.h>

int main() {
    FILE * open_file(char *, char *);
    FILE *fp;

    /*
     * 向文件中写入字符
     * fputc 写入成功返回写入的字符,写入失败返回C语言定义的EOF(符号常量,值为-1)
     */
    fp = open_file("C:/Users/kinglyjn/Desktop/test.txt", "a+"); //打开文件
    char c = getchar();
    while (c!='*') {
        fputc(c, fp);  //
        c = getchar(); //从控制台取到一个字符
    }
    fclose(fp); //关闭文件


    /**
    * 从文件中读出字符(文件的打开方式必须为读方式或读写方式)
    * 文件结束时,fgetc函数就会返回文件的结束标志EOF(-1)
    */
    fp = open_file("C:/Users/kinglyjn/Desktop/test.txt", "r");
    c = fgetc(fp);
    while (c!=EOF) {
        putchar(c); //输出一个字符到控制台
        c = fgetc(fp); //
    }
    fclose(fp);

    return 0;
}

//文件打开函数
FILE * open_file(char * filename, char * mode) {
    FILE *fp = fopen(filename, mode); //r w a rb wb ab r+ w+ a+ rb+ wb+ ab+ 只读 重写 追加
    if (fp==NULL) {
        printf("打开失败!\n");
        exit(1);
    } else {
        printf("打开成功!\n");
    }
    return fp;
}

/*
r  打开只读文件,该文件必须存在
r+ 打开可读写的文件,该文件必须存在
w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失.若文件不存在则建立该文件
w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失.若文件不存在则建立该文件
a 以附加的方式打开只写文件.若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留
a+ 以附加方式打开可读写的文件.若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留
上述的形态字符串都可以再加一个b字符,如rb、w+b或ab+等组合,加入b 字符用来告诉函数库打开的文件为二进制文件,而非纯文字文件
*/


块读写函数fwrite和fread

# include <stdio.h>
# include <stdlib.h>

typedef struct Student {
    char name[10];
    float score;
} Stu;

int main() {
    FILE * open_file(char *, char *);
    FILE *fp;
    Stu stus[3] = { {"张三", 22.2}, {"李四", 33.3}, {"王五", 44.4} };
    Stu stus2[3];
    int len = 3;

    //fwrite
    //fwrite(buffer,size,count,fp)
    //(1)buffer:是一个指针,对fread来说,它是读入数据的存放地址。对fwrite来说,是要输出数据的地址。
    //(2)size:要读写的字节数;
    //(3)count:要进行读写多少个size字节的数据项;
    //(4)fp:文件型指针。
    fp = open_file("/Users/zhangqingli/Desktop/test.txt", "w");
    for (int i=0; i<len; i++) {
        fwrite(&stus[i], sizeof(Stu), 1, fp); //
    }
    fclose(fp);

    //fread
    //fread(buffer,size,count,fp)
    fp = open_file("/Users/zhangqingli/Desktop/test.txt", "r");
    for (int i=0; i<len; i++) {
        fread(&stus2[i], sizeof(Stu), 1, fp);
    }
    fclose(fp);

    for (int i=0; i<len; i++) {
        printf("%-10s %-5.2f\n", stus2[i].name, stus2[i].score);
    }

    return 0;
}

//文件打开函数
FILE * open_file(char * filename, char * mode) {
    FILE *fp = fopen(filename, mode); //r w a rb wb ab r+ w+ a+ rb+ wb+ ab+ 只读 重写 追加
    if (fp==NULL) {
        printf("打开失败!\n");
        exit(1);
    } else {
        printf("打开成功!\n");
    }
    return fp;
}


格式化文件输入和输出函数fprintf和fscanf

  • printf/scanf函数的读写对象是终端
  • fprintf/fscanf函数的读写对象是磁盘文件
# include <stdio.h>
# include <stdlib.h>

typedef struct {
    char name[10];
    float score;
} St;

int main() {
    FILE * fp;
    FILE * open_file(char * filename, char * mode);


    //fprintf
    fp = open_file("/Users/zhangqingli/Desktop/test.txt", "w");
    fprintf(fp, "%s %f", "张三", 23.2);
    fprintf(fp, "%s %f", "李四", 23.3);
    fprintf(fp, "%s %f", "王五", 23.4);
    fclose(fp);

    //fscanf
    St *stus = (St *) malloc(sizeof(St)*3);
    fp = open_file("/Users/zhangqingli/Desktop/test.txt", "r");
    int i=0;
    while (!feof(fp)) {
        fscanf(fp, "%s %f", stus[i].name, &stus[i].score);
        i++;
    }
    fclose(fp);

    for (int i=0; i<3; i++) {
        printf("姓名:%s  分数:%f\n", stus[i].name, stus[i].score);
    }

    return 0;
}

//文件打开函数
FILE * open_file(char * filename, char * mode) {
    FILE *fp = fopen(filename, mode); //r w a rb wb ab r+ w+ a+ rb+ wb+ ab+ 只读 重写 追加
    if (fp==NULL) {
        printf("打开失败!\n");
        exit(1);
    } else {
        printf("打开成功!\n");
    }
    return fp;
}

文件的定位

# include <stdio.h>
# include <stdlib.h>

int main() {
    FILE *fp1;
    FILE * open_file(const char *, const char *);

    fp1 = open_file("/Users/zhangqingli/Desktop/test.txt", "rb");

    //把文件的位置指针移动到文件尾
    fseek(fp1, 0, SEEK_END);

    //获取文件当前指针的位置
    long len = ftell(fp1); //根据前面的操作可获取文件的长度
    printf("文件的大小为:%ld 字节\b", len);

    return 0;
}

FILE * open_file(const char * filename, const char * mode) {
    FILE *fp = fopen(filename, mode);

    if (fp==NULL) {
        printf("文件打开时出错!\n");
        exit(1);
    }

    return fp;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值