c语言文本操作的基本原理

 在这里我们主要说的是数据用二进制形式读取和文本形式进行读取的主要区别。

使用文本形式进行读取时,其实实际上就是将数据转换为字符存入文本文件中

下面测试:

#include<stdio.h>
#include<stdlib.h>
int main()
{
    FILE *fp;
    int a,b;
    if((fp=fopen("d:\abc\ceshi.txt","w"))==NULL)
       {
           printf("error!
");
           exit(0);
       }
    a=123;
    fprintf(fp,"%d%d",a,a);
    fclose(fp);
}
然后打开文件可见文件中数据为123123

下面我们读取这个数据并且用程序显示出来

#include<stdio.h>
#include<stdlib.h>
int main()
{
    FILE *fp;
    int a,b;
    if((fp=fopen("d:\abc\ceshi.txt","r"))==NULL)
       {
           printf("error!
");
           exit(0);
       }
    a=123;
    fscanf(fp,"%d",&b);
    fclose(fp);
    printf("b=%d
",b);
}
可见运行结果b=123123

那么再来一个测试

#include<stdio.h>
#include<stdlib.h>
int main()
{
    FILE *fp;
    int a,b,a1,a2;
    if((fp=fopen("d:\abc\ceshi.txt","r"))==NULL)
       {
           printf("error!
");
           exit(0);
       }
    a=123;
    fscanf(fp,"%3d%3d",&a1,&a2);
    fclose(fp);
    printf("a1=%d,a2=%d",a1,a2);
}
运行结果:a1=123,a2=123

是不是用文本方式读取数据时,将文本字符按照一定的格式转换为所需数据然后赋给对应的变量。

那么再测试:

#include<stdio.h>
#include<stdlib.h>
int main()
{
    FILE *fp;
    int a,b,a1,a2;
    if((fp=fopen("d:\abc\ceshi.txt","r"))==NULL)
       {
           printf("error!
");
           exit(0);
       }
    a=123;
    fscanf(fp,"%4d%2d",&a1,&a2);
    fclose(fp);
    printf("a1=%d,a2=%d",a1,a2);
}
咱们先来猜猜结果是什么,

O(∩_∩)O,没错就是a1=1231,a2=23;

实际上将一个字符串s1="12341234"输入文本,然后用int类型进行读取,得出的数值就是12341234

根据这次测试可以说明在以文本进行读取时,实际上是将文本中的字符按照对应的格式转化过来再赋给对应的变量。也就是说用fprintf实际是将数据转化为字符存入文本中,fscanf()实际是将字符转化为对应的数据然后赋给对应的变量。(文本操作方式)


二进制方式进行读取数据是采用位进行读取;

#include<stdio.h>
#include<stdlib.h>
int main()
{
    FILE *fp;
    int a=123,b,a1,a2;
    if((fp=fopen("d:\abc\ceshi.txt","wb"))==NULL)
       {
           printf("error!
");
           exit(0);
       }
      fwrite(&a,sizeof(a),1,fp);
      fwrite(&a,sizeof(a),1,fp);
      fclose(fp);
}


用二进制方式读取数据时采用的读取方式一般为fread(),fwrited();也是采用块进行读取;(在存储大量数据,比如在图书管理系统中一般都是用这样的方式进行储存)。

在二进制方式进行读取时,不存在这样的情况因为是fread ()fwrited()是严格按照块进行读取数据的,(也就是你告诉他读取的字节数,然后从fp所指向处读取该字节数将赋给a的地址);

用二进制储存的数据是无法查看的(会乱码)



其次注意的是二进制方式读取只能用fread(),fwrited();而且fread(),fwrited()也只能用于二进制方式进行读取


以上如果有错误,请在下方评论区指出,我将不胜感激。

原文地址:https://www.cnblogs.com/dchnzlh/p/9780094.html