黑马程序员——C语言——文件读写

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------


1. 文件概念和分类

文件:存储在外部介质上数据的集合,这个数据集有一个名称叫做文件名。

文件分类

ASCII文件(文本文件):存放每一个字符对应的ASCII值,把ASCII值转换成二进制保存。

二进制文件:按二进制编码的方式存储文件。

文件操作步骤:

引入头文件(stdio.h)

定义文件指针

打开文件

文件读写

关闭文件


2. 文件的打开与关闭

在C语言中用一个指针变量指向一个文件

FILE *指针变量标示符    eg:FILE  *fp;

文件的打开——fopen

FILE *fopen(文件名,文件打开方式);//打开成功,返回文件首地址,打开失败返回null

文件关闭函数——fclose

int fclose(文件指针变量);   //有错返回非0,否则返回0


fputc(char ch,FILE *p);   //将字符ch写入到fp指向的文件中

fgetc(FILE *p);   //从fp指向的文件中读取一个字符

r:打开一个已经存在的文本文件,准备读取数据,不能写入数据

w:创建一个新文件,准备向里面写入数据,不能从文件读取数据,如果文件已经存在,则文件将会被覆盖

a:向文本文件尾追加数据,不能从文件中读取数据,如果文件不存在则创建文件

r+:打开一个已经存在的文件,准备读写

w+:创建一个新文件,向里面读写数据,如果文件已经存在则覆盖原文件

a+:向文本文件尾追加数据,可以从文件读取数据

t:打开一个文本文件

b:打开一个二进制文件

示例代码:

//从键盘输入一个字符串,写到文件中,再显示到屏幕上
int main(int argc, const char * argv[]) {
    //定义一个文件指针
    FILE *fp=NULL;
    //用读写方式打开文件
    fp=fopen("eva.txt", "w+");
    if (fp!=NULL) {
        printf("请输入要写入文件的字符串:");
        //从键盘输入一个字符
        char ch=getchar();
        while (ch!='\n') {
            fputc(ch, fp);
            //继续从键盘输入字符
            ch=getchar();
        }
    }else{
        printf("文件打开失败!");
    }
    //把文件内部指针重新指向文件首地址
    rewind(fp);
    //从文件中读取一个字符
    char ch=fgetc(fp);
    //如果文件没有结束把读取的字符输出
    while (ch!=EOF) {
        putchar(ch);
        //继续读取下一个字符
        ch=fgetc(fp);
    }
    fclose(fp);
    
       return 0;
}

字符串读写函数

fputs(字符串,指针); //把字符串写入到指针变量指向的文件中,返回值是写入的字符串的长度

fgets(char *buf,int n,FILE *fp);   //从指针变量fp指向的文件中读取长度为n-1的字符串保存到起始地址为buf的内存空间中。

示例代码如下:

//从键盘输入一个字符串,写到文件中,再显示到屏幕上
int main(int argc, const char * argv[]) {
    //定义一个文件指针
    FILE *fp=NULL;
    //以读写方式打开文件
    fp=fopen("sally.txt", "w+");
    //判断文件是否打开成功
    if (fp!=NULL) {
        char str[100];
        printf("请输入要保存的字符串:");
        //从键盘输入一个字符串
        scanf("%s",str);
        //把输入的字符串保存到文件中
        fputs(str, fp);
    }else{
        printf("文件打开失败!");
    }
    //把文件内部指针重新指向文件首地址
    rewind(fp);
    char str1[100];
    //从文件中读取出内容保存到字符数组中
    fgets(str1, sizeof(str1), fp);
    puts(str1);
    fclose(fp);
       return 0;
}
注意:fgets从文件中读取字符串时遇到\n读取结束


数据块读取函数:

int fread(char *pt,unsigned size,unsigned n,FILE *fp);   //从fp指定的文件中读取n个长度为size的数据项,保存到pt指向的内存区

int fwrite(char *ptr,unsigned size,unsigned n,FILE *fp);  //把ptr所指向的n*size个字节写入到fp指向的文件中

示例代码如下:

/**
 从键盘输入两个学生数据,写入一个文件中,再读取这两个学生的数据显示到屏幕上
 */
#include <stdio.h>
#define LEN 100
//定义一个结构体
typedef struct Student{
    char name[LEN];
    int age;
    int score;
}MyStu;

int main(int argc, const char * argv[]) {
    MyStu stuent[2];
    //从键盘输入学生信息
    for (int i=0; i<2; i++) {
        printf("请输入第%d个学生的姓名:",i+1);
        scanf("%s",stuent[i].name);
        printf("\n请输入第%d个学生的年龄:",i+1);
        scanf("%d",&stuent[i].age);
        printf("\n请输入第%d个学生的成绩:",i+1);
        scanf("%d",&stuent[i].score);
    }
    //定义一个文件指针并打开文件
    FILE *fp=fopen("a.txt", "w+");
    if (fp!=NULL) {
        //把学生信息写到文件中
        for (int i=0; i<2; i++) {
            fwrite(&stuent[i], sizeof(MyStu), 1, fp);
        }
    }
    //把文件内部指针重新指向文件首地址
    rewind(fp);
    //定义一个结构体数组
    MyStu stu[2];
    for (int i=0; i<2; i++) {
        //把从文件中读取出的信息保存到结构体中
        fread(&stu[i], sizeof(MyStu), 1, fp);
        printf("\n第一个学生信息是:%s\t%d\t%d\t",stu[i].name,stu[i].age,stu[i].score);
    }
    //关闭文件
    fclose(fp);
    
    return 0;
}

格式化读写函数

fscanf(文件指针,格式字符串,输入列表);//按指定格式把数据从文件中读出

fprint(文件指针,格式字符串,输出列表);  //按指定格式把数据写入文件

示例代码如下:

/**
 *使用fprintf和fscanf向文件中写入一个二维数组,并读取出来
 */
#include <stdio.h>

int main(int argc, const char * argv[]) {
    int a[3][3]={1,2,3,4,5,6,7,8,9};
    //定义一个文件指针并打开
    FILE *fp=fopen("fprintf.txt", "w+");
    //判断文件是否打开成功
    if (fp!=NULL) {
        for (int i=0; i<3; i++) {
            fprintf(fp, "%d,%d,%d#",a[i][0],a[i][1],a[i][2]);
        }
    }
    //把文件内部指针移到文件首
    rewind(fp);
    //定义一个数组接收从文件中读取的数据
    int b[3][3];
    for (int i=0; i<3; i++) {
        fscanf(fp, "%d,%d,%d#",&b[i][0],&b[i][1],&b[i][2]);
    }
    //打印出二维数组中的数据
    for (int i=0; i<3; i++) {
        for (int j=0; j<3; j++) {
            printf("%d\t",b[i][j]);
        }
    }
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值