C语言文件格式化读写

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct Students
{
    char Id[10];
    char name[20];
    double score;
}Student;
void main()
{
    Student stu;//定义学生结构变量
    readText("./tmp/computer.txt");
    printf("-------------------------------------\n");
    strcpy(stu.Id,"B10003");
    strcpy(stu.name,"隔壁老王");
    stu.score=99;
    writeText("./tmp/computer.txt",stu);
    readText("./tmp/computer.txt");
}
void writeText(char *filename,Student stu)
{
    FILE *fp;
    fp=fopen(filename,"a+");//
    //    a+	打开一个文本文件,允许读写文件。如果文件不存在,则会创建一个新文件。
//                读取会从文件的开头开始,写入则只能是追加模式。
//    a	打开一个文本文件,以追加模式写入文件。如果文件不存在,则会创建一个新文件。
//                    程序会在已有的文件内容中追加内容。
    if(!fp)
    {
        printf("文件不存在!\n");
        exit(1);
    }
    fprintf(fp,"%s %s %lf\n",stu.Id,stu.name,stu.score);
    fclose(fp);
}
void readText(char *filename)
{
    Student stu;//定义学生结构变量
    FILE *fp;
    fp=fopen(filename,"r");//
//    a+	打开一个文本文件,允许读写文件。如果文件不存在,则会创建一个新文件。
//    读取会从文件的开头开始,写入则只能是追加模式。
    if(!fp)
    {
        printf("文件不存在!\n");
        exit(1);
    }
    fscanf(fp,"%s%s%lf",stu.Id,stu.name,&stu.score);//读入一条记录
    while(!feof(fp))//如果位置指针不在文件末尾,即没有读到文件末尾
    {
//        fprintf(stdout,"%-8s%-8s%3.2lf\n",stu.Id,stu.name,stu.score);//输出到标准输出stdout(屏幕)
        //等价于:
        printf("%-8s%-8s%3.2lf\n",stu.Id,stu.name,stu.score);
        //%3.2lf 表示小数点前面有三位,小数点后面有两位
//       %-8d表示显示长度最小为8个字符,不足的话右边补空格,比如 123456,显示的是“123456空格空格”
        fscanf(fp,"%s%s%lf",stu.Id,stu.name,&stu.score);//读入下一条记录
        //stu.Id这里是数组名,本质上是地址所有不用再加取地址符&
        //stu.score是double类型变量,
//        要加上取地址符“&”,让扫描函数知道把扫描到的第三数据放到的内存空间的地址
    }
    fclose(fp);
}

原文件(./tmp/computer.txt)内容:

B10000 小明 78
B10001 小王 89
B10002 小张 87
B10003 亲爱的桑吉莉娜 45.6
B10003 隔壁老王 99.000000
B10003 隔壁老王 99.000000
B10003 隔壁老王 99.000000

运行结果:

B10000  小明    78.00
B10001  小王    89.00
B10002  小张    87.00
B10003  亲爱的桑吉莉娜45.60
B10003  隔壁老王99.00
B10003  隔壁老王99.00
B10003  隔壁老王99.00
-------------------------------------
B10000  小明    78.00
B10001  小王    89.00
B10002  小张    87.00
B10003  亲爱的桑吉莉娜45.60
B10003  隔壁老王99.00
B10003  隔壁老王99.00
B10003  隔壁老王99.00
B10003  隔壁老王99.00


  • 4
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值