【【萌新的c语言学习-12--c语言文件的叙述】】

c语言文件的叙述

.c源文件 .obj目标文件
文件类型
有两种 文本文件 , 二进制文件
把内存的数据不加转化 直接转到外存就是二进制文件
我们转化成ASIC码的形式存放就是文本文件
因为你键盘上的每一个数其实都对应着相应的ASIC码值 所以我们比如说想要输入一个10000那么ASIC会直接转成文本文件
文件缓冲区
缓冲文件系统 当我们在读写数据的系统会自己生成一个文件缓冲区 这个缓冲区 分为了一个是输出缓冲区 另一个是输入缓冲区 从内存向磁盘输出数据会先送到内存中的缓冲区,等装满之后一起送过去
文件指针 每个被使用的文件就会在内存中开辟一块区存放文件的一些基本信息 就像是存放test.txt的相关信息
相关信息有文件名 创建时间 大小 等等
在编写程序的时候,打开文件都会返回一个FILE类型的指针变量指向该文件
文件的打开和关闭
fopen
打开方式例如 “w"
我们想要打开test.txt
FILE
pf =fopen(“test.txt”, “r”);
那么就会创建一个包含test.txt文件信息区
这个区域很好的管理了test.txt
这个区域指向了test.txt的内容 而我们的pf指向了这个文件信息区

文件的顺序读写

int main()
{
FILE* pfwrite = fopen("TEST.txt", "w");
if (pfwrite == NULL)
{
printf("%s\n", strerror(errno));
}
else
{
//写文件
fputc('b', pfwrite);
fputc('i', pfwrite);
fputc('t', pfwrite);
}
//关闭文件
fclose(pfwrite);
pfwrite = NULL;
return 0;
}

//这样的话里面放了一个bit

int main()
{
    FILE* pfread = fopen("test.txt", "r");
    if (pfread == NULL)
    {
        printf("%s\n", strerror(errno));
    }
    else
    {
        //读文件
        printf("%c", fgetc(pfread));
        printf("%c", fgetc(pfread));
        printf("%c", fgetc(pfread));
    }
    //关闭文件
    fclose(pfread);
    pfread = NULL;
    return 0;
}

/读出了bit
我们会经常说的输入输出
输入是从键盘输入
输出是从键盘输出
键盘和屏幕都是外部设备
键盘是标准输入设备
屏幕是标准输出设备
两个标准设备是一个程序默认打开的两个流设备
stdin FILE*
stdout FILE*
stderr FILE*

int main()
{
    int ch=fgetc(stdin);
    fputc(ch, stdout);

}

完成了从键盘写向屏幕读出的过程
打开文件fopen
关闭文件fclose
结束之后还需要我们手动将其置为空指针
/结合起来的总的操作

int main()
{
FILE* pf = fopen("test.txt", "w");
if (pf == NULL)
{
printf("%s\n", strerror(errno));
return 0;
}
//写文件
fputc('x',pf);
fputc('x',pf);
fputc('n',pf);
//关闭文件
fclose(pf);
pf = NULL;
return 0;

}
int main()
{
    char buf[1024] = { 0 };
    FILE* pf = fopen("test.txt", "r");
    if (pf == NULL)
    {
        return 0;
    }
    //读文件
    //一次性读一行
    fgets(buf, 1024, pf);
    printf("%s", buf);
    //buf里面本来就有一个换行

    //关闭文件
    fclose(pf);
    pf = NULL;
    return 0;
}

fgets puts 其实只是我们现在学一个大概在以后实际操作中学会去查找表格,告诉你真的该怎么用

int main()
{
    char buf[1024] = { 0 };
    FILE* pf = fopen("test.txt", "w");
    if (pf == NULL)
    {
        return 0;
    }
    //写文件
    //fputs是用来写一个字符串
    fputs("hello", pf);
    fputs("world", pf);

    //关闭文件
    fclose(pf);
    pf = NULL;
    return 0;
}

最后出来的结果是helloworld

int main()
{
    //从键盘上读取一行文本信息
    char buf[1024] = { 0 };
    fgets(buf,1024,stdin);//从标准输入读取
    fputs(buf, stdout);//输出到标准输出流
    return 0;
}

这样的写法等价于

gets(buf);
puts(buf);
struct s
{
int n;
float score;
char arr[10];
};
int main()
{
struct s s = { 100,3.14f , "bit" };
FILE* pf = fopen("test.txt", "w");
if (pf == NULL)
{
return 0;
}
//格式化的形式写文件
fprintf(pf, "%d %f %s", s.n, s.score, s.arr);
fclose(pf);
pf = NULL;
return 0;

}

置入结构体的写法
格式化的输入数据

struct s
{
    int n;
    float score;
    char arr[10];
};
int main()
{
    struct s s = { 0 };
    FILE* pf = fopen("test.txt", "r");
    if (pf == NULL)
    {
        return 0;
    }
    //格式化的输入数据
    fscanf(pf,"%d %f %s", &(s.n), &(s.score), &(s.arr));
    printf("%d %f %s", s.n, s.score, s.arr);



    fclose(pf);
    pf = NULL;
    return 0;
}

从键盘获取信息然后输出在屏幕上

struct s
{
    int n;
    float score;
    char arr[10];
};
int main()
{
    struct s s = { 0 };
    
    fscanf(stdin, "%d %f %s", &(s.n), &(s.score), &(s.arr));
    fprintf(stdout, "%d %f %s", s.n, s.score, s.arr);
    return 0;
}

对比一组函数
scanf/fscanf/sscanf
printf/fprintf/sprintf

scanf/printf是
针对标准输入流/
标准输出流的格式化输入/输出
fscanf/fprintf是
针对所有输入流/
所有输出流的格式化输入/输出
sscanf/sprintf是
从字符串中读取格式化的数据
把格式化的数据输出成字符串

下面是举例

struct s
{
    int n;
    float score;
    char arr[10];
};
int main()
{
    //
    struct s s = {100,3.14f , "abcdef"};
    char buf[1024] = { 0 };
    struct s tmp = { 0 };
    //把格式化的数据转化成字符串然后存储到buf中
    sprintf(buf, "%d %f %s", s.n, s.score, s.arr);
    //printf("%s\n", buf);
    //从buf中读取格式化的数据到tmp
    sscanf(buf, "%d %f %s", &(tmp.n), &(tmp.score), tmp.arr);
    printf("%d %f %s\n",tmp.n , tmp.score , tmp.arr);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值