C经典 文件的操作

一、常用函数
这里写图片描述

二、文件指针,指向文件的指针
FILE *fp;

三、文件的打开与关闭
FILE *fp = fopen(文件名,使用文件方式)
如:FILE *fp = NULL;
fp = fopen(” file.txt”,”r”);//r 表示读文件

int result = fclose(fp) ;// =0,如果不等于0,表示发生错误

四、读写方式
这里写图片描述

五、补充:
\0 :表示字符串结束
\n :表示回车换行
EOF :表示文件的末尾

六、关于中文读取
因为一个汉字占三个字节,一个字节等于8位
在C语言里每个字符串结束时都以\0
所以在读取的时候不能只读三个,会乱码

FILE *fp = fopen(“a.txt”,”r”);
//a.txt里存放的是中文
错误代码如:

char ch[3] ;
fgets(ch,3, fp);
printf("%s\n",ch);

正确代码如:

char ch[4] ;
fgets(ch,4, fp);
printf("%s\n",ch);

七、示例代码1

#include <stdio.h>
#include <string.h>
int main(int argc, const char * argv[])
{
   //定义文件指针
    FILE *fw = NULL;
    fw = fopen("a.txt", "w");
    char ch[7] = "abcdefg";
    if (fw != NULL) {
        //写入
        for(int i = 0 ; i <strlen(ch); i ++ ){
            printf("%c\t",ch[i]);
            fputc(ch[i], fw);
        }

    }else{
        printf("写入失败!");
        getchar();
        exit(1);
    }

    printf("\n");
    FILE *fr = NULL;
    fr = fopen("a.txt", "r");
    if(fr != NULL){
        char c = fgetc(fr);
        //读取
        while(c != EOF){
            putchar(c);
            c = fgetc(fr);
        }
    }else{
        printf("读取失败!");
        getchar();
        exit(1);

    }


    //fclose(fw);
    //fclose(fr);

    printf("\n");
    return 0;
}

七、示例代码2

#include <stdio.h>
#include <string.h>
int main(int argc, const char * argv[])
{
   //定义文件指针
    FILE *fp = NULL;
    fp = fopen("a.txt", "a+");    
    if (fp != NULL) {
        //写入
        printf("请输入字符");
        char ch = getchar();
        int count = 0;
        while(ch !='\n'){
            count ++;
           fputc(ch,fp);
           ch = getchar();
        }
        fclose(fp);
        printf("\n");   
        //把指针移到开始位置
        rewind(fp);
        //读取数据
        ch = fgets(fp);
        while(ch != EOF){
            putchar(ch);
            ch = fgets(fp);
        }
    }else{
        printf("写入失败!");
        getchar();
        exit(1);
    }



    printf("\n");
    return 0;
}

八、fread与fwrite函数
1)fread(buffer,size,count,fp);
2)fwrite(buffer,size,count,fp):
这里写图片描述

示例代码:
fwrite写入数据

FILE *fp =fopen("a.txt","wb");
if(fp !=NULL){
    char *ch = "kkkkkkk\n";
    fwrite(ch,1,strlen(ch),fp);
    fwrite(ch,1,strlen(ch),fp);
}else{
     printf("写入失败!");
        getchar();
        exit(1);
}
fclose(fp);

fread读取数据

FILE *fp =fopen("a.txt","rb");
if(fp !=NULL){
    char ch[100];
    fread(ch,1,sizeof(ch),fp);
    printf("%s\n",ch);
}else{
     printf("写入失败!");
        getchar();
        exit(1);
}
fclose(fp);

九、结构体的读写

#include <stdio.h>
struct Student{
    char name[20];
    int age;
    float score;
};
int main(int argc, const char * argv[])
{

    // 定义数组
    struct Student stu[3] ={{"tom",22,89},{"kite",34,67},{"jelly",21,90}};
    FILE *fp = fopen("stu.data", "wb+");
    if(fp !=NULL){
    for(int i =0; i < 3; i++){
        fwrite(&stu[i],sizeof(struct Student),1,fp);

    }
    printf("写入成功!\n");

    rewind(fp);
    struct Student s[3];
    for(int i = 0; i < 3; i++){
        fread(&s[i],sizeof(struct Student),1,fp);
        printf("%s\t",s[i].name);
    }
    }


    fclose(fp);
    printf("\n\n");
    return 0;
}

十、fscanf和fprintf的用法
这里写图片描述
示例1

#include <stdio.h>

int main(int argc, const char * argv[])
{

    // 写入 9##2;到文件 test.txt
    int a = 9;
    int b = 2;
    FILE *fp = fopen("text.txt","w+");
    if(fp != NULL){
        fprintf(fp, "%d##%d;", a,b);

        rewind(fp);
        int m=0;
        int n=0;
        fscanf(fp, "%d##%d;",&m,&n);
        printf("m=%d,n=%d",m,n);
    }


    printf("\n");
    return 0;
}

示例2

#include <stdio.h>
/** 
 读写如下文件
 1,2#
 3,4#
 5,6#
 */
int main(int argc, const char * argv[])
{

    // 定义数组
    char ch[3][2] = {1,2,3,4,5,6};
    //定义指针
    FILE *fp = fopen("a.txt", "w+");
    //
    if (fp!=NULL) {
        //写入
        for (int i = 0; i <3; i ++) {
            fprintf(fp, "%d,%d#",ch[i][0],ch[i][1]);
        }
        printf("写入成功\n");

        rewind(fp);
        //读取
        int arr[3][2];
        for (int i = 0; i <3; i ++) {
            fscanf(fp, "%d,%d#",&arr[i][0],&arr[i][1]);
            printf("%d,%d",arr[i][0],arr[i][1]);
        }
    }
    fclose(fp);


    return 0;
}

十一、文件随机读取,定位fseek
fseek(fp,curPosition,headPosition);
如:fseek(fp,100L,0);

文件首:SEEK_SET 0
当前位置:SEEK_CUR 1
文件尾部:SEEK_END 2
示例:读取第二个学生的成绩

#include <stdio.h>
struct Student{
    char name[20];
    int age;
    float score;
};
int main(int argc, const char * argv[])
{

    // 定义数组
    struct Student stu[3] ={{"tom",22,89},{"kite",34,67},{"jelly",21,90}};
    FILE *fp = fopen("stu.data", "wb+");
    if(fp !=NULL){
    for(int i =0; i < 3; i++){
        fwrite(&stu[i],sizeof(struct Student),1,fp);

    }
    printf("写入成功!\n");

    //定位到第二个学生
    fseek(fp,sizeof(struct Student),SEEK_SET);

    fread(&stu,sizeof(struct Student),1,fp);
    printf("%s\t",stu.name);
    }
    }


    fclose(fp);
    printf("\n\n");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lovoo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值