精华内容
下载资源
问答
  • C语言文件读写

    2020-12-24 14:55:51
    文章目录前言一、文件的打开(fopen函数)二、文件关闭(fclose函数)三、C中文本文件和二进制文件的区别四、C语言以字符形式读写文件五、C语言以字符串形式读写文件六、C语言中的文件复制操作七、C语言文件常用的...


    前言

    提示:在C语言中,文件操作都是由库函数来完成的,下面总结下文件的相关操作。

    一、文件的打开(fopen函数)

    fopen()函数用来打开一个文件,它的格式为:

    FILE *fopen(char *filename,char *type);
    

    filename为文件名(包括文件路径),type为打开方式,它们都是字符串。fopen() 会获取文件信息,包括文件名、文件状态、当前读写位置等,并将这些信息保存到一个FILE类型的结构体变量中,然后将该变量的地址返回。如果接收 fopen() 的返回值,就需要定义一个 FILE 类型的指针。例如:

    FILE *fp = ("demo.txt", "r");
    
    打开方式(type)如表格所示:
    
    类型 详解
    “r”(只读) 为输入打开一个文本文件
    “w”(只写) 为输出打开一个文本文件
    “a”(追加) 为追加打开一个文本文件
    “rb”(只读) 为输入打开一个二进制文件
    “wb”(只写) 为输出打开一个二进制文件
    “ab”(追加) 为追加打开一个二进制文件
    “r+”(读写) 为读/写打开一个文本文件
    “w+”(读写) 为读/写创建一个文本文件
    “a+”(读写) 为读/写打开一个文本文件
    “rb+”(读写) 为读/写打开一个二进制文件
    “ wb+”(读写) 为读/写创建一个二进制文件
    “ab+”(读写) 为读/写打开一个二进制文件

    在打开一个文件时,如果出错,fopen将返回一个空指针值NULL。
    代码如下(示例):

    FILE *fp = NULL;
    if(fp = fopen("D:\\test.txt","rb") == NULL) //判断打开的文件是否为空,如果为空,则提示错误
    {
    	printf("open file is error D:\\test.txt file!\n");
    	exit(1);
    }
    

    二、文件关闭(fclose函数)

    代码如下(示例):

    if(fclose(fp) == 0)     //文件关闭,如果成功则返回值为0,返回值为非0表示关闭错误
    {
        printf("close fp success\n");
    }
    else
    {
        printf("close fp fail\n");
    }
    

    三、C中文本文件和二进制文件的区别

    二进制是按照二进制编码方式存放在文件中的,虽然可以在屏幕上显示,但是不能读懂,文本文件是ASC码,可以在屏幕上按字符显示。

    四、C语言以字符形式读写文件

    以字符形式读写文件时,每次可以从文件中读取一个字符,或者向文件中写入一个字符。主要使用两个函数:fgetc()和fputc()。fgetc 是 file get char 的缩写,意思是从指定的文件中读取一个字符。它的原型为:

    int fgetc (FILE *fp); //fp 为文件指针。
    

    fgetc() 读取成功时返回读取到的字符,读取到文件末尾或读取失败时返回EOF。EOF 是 end of file 的缩写,表示文件末尾,是在 stdio.h 中定义的宏,它的值是一个负数,往往是 -1。EOF 不绝对是 -1,也可以是其他负数,这要看编译器的实现。
    代码如下(示例):

    char ch;
    while( (ch=fgetc(fp)) != EOF )  //每次读取一个字节,直到读取完毕
    putchar(ch);                    //输出字符ch的值
    fputc('a', fp);                 //想文本中输入字符a
    

    EOF 本来表示文件末尾,意味着读取结束,但是很多函数在读取出错时也返回 EOF,那么当返回EOF时,到底是文件读取完毕了还是读取出错了?我们可以借助 stdio.h 中的两个函数来判断,分别是 feof() 和 ferror()。

    // feof() 函数用来判断文件内部指针是否指向了文件末尾,它的原型是:
    int feof ( FILE * fp ); //当指向文件末尾时返回非零值,否则返回零值。
    // ferror() 函数用来判断文件操作是否出错,它的原型是:
    int ferror ( FILE *fp ); //出错时返回非零值,否则返回零值。
    

    五、C语言以字符串形式读写文件

    fgets() 函数用来从指定的文件中读取一个字符串,并保存到字符数组中,它的原型为:

    char *fgets ( char *str, int n, FILE *fp ); //str 为字符数组,n 为要读取的字符数目,fp 为文件指针。
    

    返回值:读取成功时返回字符数组首地址,也即 str;读取失败时返回 NULL;如果开始读取时文件内部指针已经指向了文件末尾,那么将读取不到任何字符,也返回 NULL。读取到的字符串会在末尾自动添加 ‘\0’,n 个字符也包括 ‘\0’。也就是说,实际只读取到了 n-1 个字符,如果希望读取 100 个字符,n 的值应该为 101。
    代码如下(示例):

    char str[N];
    while(fgets(str, N, fp) !=NULL)
    {
    	printf("str = %s",str);
    }
    

    六、C语言中的文件复制操作

    #define N 101
    FILE *wfp = NULL;
    FILE *rfp = NULL;
    if((wfp = fopen("D:\\test1.jpg","wb")) == NULL) //判断打开的文件是否为空
    {
    	printf("open file is error D:\\test.txt file!");
    	exit(1);
    }
    if((rfp = fopen("D:\\1.jpg","rb")) == NULL) //判断打开的文件是否为空
    {
    	printf("open file is error D:\\test.txt file!");
    	exit(1);
    }
    char buf[N]; //定义一个buf,作为缓存区
    int len = 0; //读取的长度
    while((len = fread(buf,sizeof(char),N,rfp))!=0)
    {
    	fwrite(buf,sizeof(char),len,wfp);
    }
    fclose(wfp);
    fclose(rfp);
    

    七、C语言中文件常用的函数

    fseek(fp,0,SEEK_END);   //SEEK_END文件末尾,0偏移量.
    fseek(fp,0,SEEK_SET);   //SEEK_END文件头,0偏移量.
    long filesize = ftell(fp); //返回当前的文件指针,相对于文件开头的位移量.
    int ret = fprintf(fp,"%s","测试");//将文件格式化方式写入到文件中,成功返回字符串长度,错误返回负数.
    int ret = feof(fp);//判断是否到文件尾部,如果是返回一个正数,不是返回0.
    int ret = fflush(fp); //刷新文件缓存区,如果返回0,则表示成功,EOF表示失败,错误在error中.
    rewind(fp);//设置文件流位置为开头,和fseek()一样.
    long int ftell(FILE *stream);返回文件当前的位置
    

    八 、文件加解密

    通过字符串++和减减实现字符的加密和解密

    void encrypt(char *s)   //文件加密
    {
        while(*s)
        {
            (*s)++;
            s++;
        }
    }
    void disencrypt(char *s)    //文件解密
    {
        while(*s)
        {
            (*s)--;
            s++;
        }
    }
    

    九、文件的重命名和删除

    remove("E:\\Study\\program\\QT\\file\\a.txt");//删除文件a.txt
    rename("E:\\Study\\program\\QT\\file\\b.txt","E:\\Study\\program\\QT\\file\\a.txt");//重命名b.txt为a.txt
    

    总结

    1、读取文件文本和写入文件文本应该分开封装,如果文件打开后,写入文件,然后在读取文件,很容易出现问题(如果写入文件长度为4,但是读取长度为8,则文件后面会追加4个空格)。 2、在windows下,文本文件打开文件\n换行,会自动在前面加入\r,但是二进制打开不会。 3、在使用fread读取文件,并且显示时,一次读取的大小要小于buf的定义的大小,不然,会出现越界,不能自动追加'\0'结尾,但是如果是文件复制,则可以。
    展开全文
  • C语言文件读写命令

    千次阅读 2016-08-31 11:11:07
    C语言文件读写命令 C语言把磁盘文件看成是字符(或字节)的序列,按照存储信息的形式来说,文件主要是有文本文件和二进制文件。文本文件由一个个字符组成,每个字节存放一个ASCII码制,代表一个字符。二进制文件...

    C语言文件读写命令

    C语言把磁盘文件看成是字符(或字节)的序列,按照存储信息的形式来说,文件主要是有文本文件和二进制文件。文本文件由一个个字符组成,每个字节存放一个ASCII码制,代表一个字符。二进制文件把内存中的数据按其在内存中的存储形式原样放入磁盘空间。

    二进制文件以及文本文件都可以看做是“数据流”。

    流文件的特点是,处理时不需考虑文件中的数据的性质、类型和存放格式。访问时只是以字节为单位对数据进行存取,没有记录的概念,而将对数据结构的分析、处理等工作都交给后续程序区处理。系统会自动为这在使用的每个文件开辟一个缓存区,从内存向磁盘输出数据必须先送到内存中的缓存区,装满缓存后才一起送到磁盘。

     

    一、文件的打开与关闭

       文件在进行读写操作之前要先打开,使用完毕要关闭。所谓打开文件,实际上是建立文件的各种有关信息,并使文件指针指向该文件,以便进行其它操作。关闭文件则断开指针与文件之间的联系,也就禁止再对该文件进行操作。

    fopen函数用来打开一个文件,其调用的一般形式为:
    文件指针名=fopen(文件名,使用文件方式);
    其中:
    “文件指针名”必须是被说明为FILE 类型的指针变量;
    “文件名”是被打开文件的文件名;
    “使用文件方式”是指文件的类型和操作要求。
    “文件名”是字符串常量或字符串数组。

    使用文件的方式共有12种,下面给出了它们的符号和意义。
    “r”
    只读打开一个文本文件,只允许读数据
    “w”
    只写打开或建立一个文本文件,只允许写数据
    “a”
    追加打开一个文本文件,并在文件末尾写数据
    “rb”
    只读打开一个二进制文件,只允许读数据
    “wb”
    只写打开或建立一个二进制文件,只允许写数据
    “ab”
    追加打开一个二进制文件,并在文件末尾写数据
    “r+”
    读写打开一个文本文件,允许读和写
    “w+”
    读写打开或建立一个文本文件,允许读写
    “a+”
    读写打开一个文本文件,允许读,或在文件末追加数据
    “rb+”
    读写打开一个二进制文件,允许读和写
    “wb+”
    读写打开或建立一个二进制文件,允许读和写
    “ab+”
    读写打开一个二进制文件,允许读,或在文件末追加数据

    对于文件使用方式有以下几点说明:
    1) 文件使用方式由r,w,a,t,b,+六个字符拼成,各字符的含义是:
    r(read): 读
    w(write): 写
    a(append): 追加
    t(text): 文本文件,可省略不写
    b(banary): 二进制文件
    +: 读和写
    2) 凡用“r”打开一个文件时,该文件必须已经存在,且只能从该文件读出。
    3) 用“w”打开的文件只能向该文件写入。若打开的文件不存在,则以指定的文件名建立该文件,若打开的文件已经存在,则将该文件删去,重建一个新文件。
    4) 若要向一个已存在的文件追加新的信息,只能用“a”方式打开文件。但此时该文件必须是存在的,否则将会出错。
    5) 在打开一个文件时,如果出错,fopen将返回一个空指针值NULL。在程序中可以用这一信息来判别是否完成打开文件的工作,并作相应的处理。

    二、文件的读写
    对文件的读和写是最常用的文件操作。在C语言中提供了多种文件读写的函数:
    ·字符读写函数 :fgetc和fputc
    ·字符串读写函数:fgets和fputs
    ·数据块读写函数:freed和fwrite
    ·格式化读写函数:fscanf和fprinf
    下面分别予以介绍。使用以上函数都要求包含头文件stdio.h。

    (1)字符读写函数 :fgetc和fputc

    ·fgetc函数的功能是从指定的文件中读一个字符,函数调用的形式为:
        字符变量=fgetc(文件指针);
        对于fgetc函数的使用有以下几点说明:
        1) 在fgetc函数调用中,读取的文件必须是以读或读写方式打开的。
        2) 读取字符的结果也可以不向字符变量赋值, 例如: fgetc(fp); 但是读出的字符不能保存。
        3) 在文件内部有一个位置指针。用来指向文件的当前读写字节。在文件打开时,该指针总是指向文件的第一个字节。使用fgetc 函数后,该位置指针将向后移动一个字节。因此可连续多次使用fgetc函数,读取多个字符。应注意文件指针和文件内部的位置指针不是一回事。文件指针是指向整个文件的,须在程序中定义说明,只要不重新赋值,文件指针的值是不变的。文件内部的位置指针用以指示文件内部的当前读写位置,每读写一次,该指针均向后移动,它不需在程序中定义说明,而是由系统自动设置的。

    ·fputc函数的功能为向指定的文件中写入一个字符,函数调用的形式为:
        fputc(字符量,文件指量或变量),
        例如:
        fputc('a',fp);
        其意putc函数的使用也要说明几点:
        1) 被写入的文件可以用写、读写、追加方式打开,用写或读写方式写入字符从文件首开始。如需保留原有文件内容,希望写入的字符被写入的文件若不存在,则创建该文件。
        2) 每写入一个字符,文件内部位置指针向后移动一个字节。
        3) fputc函数有一个返回值,如写入成功则返回写入的字符,否则返回一个EOF。可用此来判断写符,写入一个文件,再把该文件内容读出显示在屏幕上。

    【示例程序】
    #include <stdio.h>
    #include <stdlib.h>
    #define MAXLEN 1024
    main()
    {
        FILE *fpr = fopen("1.txt","r");
        FILE *fpw = fopen("2.txt","a+");
        char *arrayCh = NULL;
        char ch;
        if(NULL == fpr){
            printf("1.txt open failed!\n");
            exit(1);
        }
        if(NULL == fpw){
            printf("2.txt open failed!\n");
            exit(1);
        }
        printf("Both file open successd!\n");
        while((ch = fgetc(fpr)) != EOF){
            fputc(ch,fpw);
        }
        while((ch = fgetc(fpw)) != EOF){
            printf("%c",ch);
        }
        fclose(fpw);
        fclose(fpr);
        exit(0);
    }

    (2) 字符串读写函数:fgets和fputs

    ·fgets函数的功能是从指定的文件中读一个字符串到字符数组中,函数调用的形式为:
        fgets(字符数组名,n,文件指针);
        其中的n是一个正整数。表示从文件中读出的字符串不超过 n-1个字符。在读入的最后一个字符后加上串结束标志'\0'。
        例如:fgets(str,n,fp);的意义是从fp所指的文件中读出n-1个字符送入字符数组str中。
        对fgets函数有两点说明:
      1). 在读出n-1个字符之前,如遇到了换行符或EOF,则读出结束。
      2). fgets函数也有返回值,其返回值是字符数组的首地址。

    ·fputs函数的功能是向指定的文件写入一个字符串,其调用形式为:
        fputs(字符串,文件指针) 其中字符串可以是字符串常量,也可以是字符数组名 或 指针变量,
        例如:
        fputs(“abcd“,fp);其意义是把字符串“abcd”写入fp所指的文件之中。

    【程序示例】
    #include<stdio.h>
    #include<stdlib.h>
    main()
    {
        char str[11];
        FILE *fpr = fopen("1.txt","r");   
        FILE *fpw = fopen("2.txt","a+");
        if(NULL == fpr){
            printf("1.txt open failed!\n");
            exit(1);
        }
        if(NULL == fpw){
            printf("2.txt open failed!\n");
            exit(1);
        }
        printf("file open successed!\n");
        fgets(str,11,fpr);
        printf("%s\n",str);
        fputs(str,fpw);
        fclose(fpr);
        fclose(fpw);
        exit(0);
    }

    (3)数据块读写函数:fread和fwrite

    C语言还提供了用于整块数据的读写函数。 可用来读写一组数据,如一个数组元素,一个结构变量的值等。

    ·读数据块函数fread调用的一般形式为: fread(buffer,size,count,fp);

    ·写数据块函数fwrite调用的一般形式为: fwrite(buffer,size,count,fp);

        其中buffer是一个指针,在fread函数中,它表示存放输入数据的首地址。在fwrite函数中,它表示存放输出数据的首地址。 size 表示数据块的字节数。count 表示要读写的数据块块数。fp 表示文件指针。

    【程序示例】
    #include<stdio.h>
    #include<stdlib.h>
    #define MAXSIZE 2
    struct stu{
        char name[20];
        int age;
        char addr[20];
    }boy[MAXSIZE];
    main()
    {
        FILE *fp = fopen("2.txt","w+");
        struct stu rboy[MAXSIZE];
        int i;
        int temp = 0;
        if(NULL == fp){
            printf("2.txt open failed!\n");
            exit(1);
        }
        printf("File open successed!\n");
        printf("input data: ");
        for(i = 0;i < MAXSIZE;i++){
            scanf("%s%d%s",boy[i].name,&boy[i].age,boy[i].addr);
        }
        for(i = 0;i < MAXSIZE;i++){
            printf("%s  %d  %s\n",boy[i].name,boy[i].age,boy[i].addr);
        }
        fwrite(boy,sizeof(struct stu),MAXSIZE,fp);
        rewind(fp);
        fread(rboy,sizeof(struct stu),MAXSIZE,fp);
        for(i = 0;i < MAXSIZE;i++){
            printf("name:%s  age:%d  addr:%s\n",rboy[i].name,rboy[i].age,rboy[i].addr);
        }
        fclose(fp);
        exit(0);
    }

    (4)格式化读写函数:fscanf和fprinf

    fscanf函数,fprintf函数与scanf和printf 函数的功能相似,都是格式化读写函数。 两者的区别在于 fscanf 函数和fprintf函数的读写对象不是键盘和显示器,而是磁盘文件。

    这两个函数的调用格式为: 

    ·fscanf(文件指针,格式字符串,输入表列);

    ·fprintf(文件指针,格式字符串,输出表列);

    例如:
      fscanf(fp,"%d%s",&i,s);
      fprintf(fp,"%d%c",j,ch);

    【示例程序】
    #include<stdio.h>
    #include<stdlib.h>
    #define MAXSIZE 2
    struct stu{
        char name[20];
        int age;
        char addr[20];
    }boy[MAXSIZE];
    main()
    {   
        FILE *fp = fopen("2.txt","w+");
        struct stu rboy[MAXSIZE];
        int i;
        if(NULL == fp){
            printf("2.txt open failed!\n");
            exit(1);
        }
        printf("enter data:\n");
        for(i = 0;i < MAXSIZE;i++){
            scanf("%s%d%s",boy[i].name,&boy[i].age,boy[i].addr);
        }
        for(i = 0;i < MAXSIZE;i++){
            fprintf(fp,"%s %d %s\n",boy[i].name,boy[i].age,boy[i].addr);
        }
        for(i = i;i < MAXSIZE;i++){
            fscanf(fp,"%s%d%s",rboy[i].name,&rboy[i].age,rboy[i].addr);
        }
        fclose(fp);
        exit(0);

    展开全文
  • C语言 文件读写的实现

    千次阅读 多人点赞 2019-04-26 11:55:33
    关于C语言文件读写,我将介绍下面这几种方式: 字符的读写:使用 fgetc() 函数 和 fputc() 函数; 字符串的读写:使用 fgets() 函数和 fputs() 函数; 格式化的读写(主要用于文本文件):使用 ...

    关于C语言的文件读写,我将介绍下面这几种方式:

    • 字符的读写:使用 fgetc() 函数 和 fputc() 函数;

    • 字符串的读写:使用 fgets() 函数和 fputs() 函数;

    • 格式化的读写(主要用于文本文件):使用 fscanf() 函数和 fprintf() 函数。

    字符读写:

    1. fputc()函数

    fputc(c,fp);   //用于将一个字符写入文件
    

    其中,fp为文件指针变量;c为要写入的字符,可以是字符常量或字符型变量。函数返回值:如果执行成功,返回写入的字符;否则,返回EOF。

    int main()
    {
    	FILE *fp;           //定义文件指针
    	char ch;            //字符指针
    	fp=fopen("C://Users//Administrator//Desktop//tcc//trans//in.txt","w"); //打开文件,写入模式
    	if(fp==NULL)        //若fopen()函数返回NULL则打开文件失败
    	{
    		printf("文件打开失败\n");
    	}
    	else
    	{
    		printf("请输入内容(以回车结束):\n");        
    		while((ch = getchar()) != '\n')  //读取字符进行写入,读取到“\n”结束
    		{
    			fputc(ch,fp);
    		}
    	}
    	fclose(fp);   //关闭文件
    	return 0;
    }
    

    由于没有写循环,目前只能输入一行文本内容。

    2. fgetc()函数

     c=fgetc(fp);    //用来从指定的文本文件中读取一个字符。
    

    其中,fp为文件指针,c为要写入的字符。该函数的功能是从指定的文件中读取一个字符,并赋值给字符型变量c。

    函数返回值:读取成功,返回读取字符;读取错误或遇到结束标志EOF,返回EOF。

    int main()
    {
    	FILE *fp;           //定义文件指针
    	char ch;            //字符指针
    	fp=fopen("C://Users//Administrator//Desktop//tcc//trans//in.txt","r"); //打开文件,只读模式
    	if(fp==NULL)        //若fopen()函数返回NULL则打开文件失败
    	{
    		printf("文件打开失败\n");
    	}
    	else
    	{
    		while((ch=fgetc(fp))!=EOF)    //读取文件字符,直到返回fgetc()函数返回EOF
    		{
    			 putchar(ch);             //在显示窗口输出字符
    		}
    		putchar('\n');                //输出回车
    	}
    	fclose(fp);
    	return 0;
    }
    

    字符串读写

    1. fputs()函数

    fputs(s,fp);     //用来将一个字符串写入指定的文本文件。 
    

    其中,fp为文件指针,s可以是字符数组名,字符型指针变量或字符串常量。该函数的功能是将字符串s写入由fp指向的文件中,字符串末尾的‘\0’字符不允写入。

    函数返回值:执行成功,返回所写的最后一个字符;否则,返回EOF。

    int main()
    {
    	FILE *fp;           //定义文件指针
    	char s[][100]={"a 一","b 地","c 现","cd 三","about 关于"};            //将字符串存入数组
    	int i;
    	fp=fopen("C://Users//Administrator//Desktop//tcc//trans//in.txt","w"); //打开文件,写入模式
    	if(fp==NULL)        //若fopen()函数返回NULL则打开文件失败
    	{
    		printf("文件打开失败\n");
    	}
    	else
    	{
    		for(i=0;i<5;i++)         //注意数组从0开始
    		{
                fputs(s[i],fp);      //在文件中写入数组中的字符串
                fputs("\n",fp);      //在文件中写入回车
    		}
        }
    	fclose(fp);   //关闭文件
    	return 0;
    }
    

    运行结果:
    在这里插入图片描述
    2. fgets()函数

    fgets(s,n,fp);     //用于从指定的文件中读一个字符串到字符数组中。
    

    其中,s可以是字符型数组名或字符串指针;n是指定读入的字符个数;fp为文件指针。n是一个正整数,表示从文件中最多读取n-1个字符,并将字符串指针s定位在读入的字符串首地址。

    fgets()函数从文件中读取字符直到遇到回车符或EOF为止,函数会在最后一个字符后加上字符串结束标志’\0’;若有EOF,则不予保留。

    函数返回值:该函数如果执行成功,返回读取字符串;如果失败,则返回空指针NULL,这时,s中的内容不确定。

    int main()
    {
    	FILE *fp;           //定义文件指针
    	char s[5][100];     
    	int i;
    	fp=fopen("C://Users//Administrator//Desktop//tcc//trans//in.txt","r"); //打开文件,只读模式
    	if(fp==NULL)        //若fopen()函数返回NULL则打开文件失败
    	{
    		printf("文件打开失败\n");
    	}
    	else
    	{
    		for(i=0;i<5;i++)
    		{
    			fgets(s[i],100,fp);    //读取字符串存入数组
    			printf("%s",s[i]);     //输出字符串
    		}
    	}
    	fclose(fp);
    	return 0;
    }
    

    运行结果:
    在这里插入图片描述

    格式化读写

    1. fprintf()函数

    fprintf(fp,format, arg1, arg2,….,argn);
    

    fprintf()用来将输出项按指定的格式写入指定的文本文件中,其中格式化规定与printf()函数功能相似,所不同的只是fprintf()函数是将输出的内容写入文件中,而printf()函数则是在屏幕输出。

    其中,fp为文件指针,format为指定的格式控制字符串;arg1~argn为输出项,可以是字符、 字符串或各种类型的数值。该函数的功能是按格式控制字符串format给定的格式,将输出项arg1,arg2,……,argn的值写入fp所指向的文件中。

    函数返回值:如果函数执行成功,返回实际写入文件的字符个数;若出现错误,返回负数。

    具体格式:

    fprintf(fp,"%s",s[i]);      //在文件中写入数组中的字符串
    

    2. fscanf()函数

    fscanf(fp,format,arg1,arg2,…..,argn);
    

    fscanf()用来按规定的格式从指定的文本文件中读取数据。它与scanf()函数的功能相似,都是按规定的格式读数据的函数,只是fscanf()函数读的对象不是键盘区,而是文件。

    其中,fp为文件指针,format为指定的格式控制字符串;arg1~argn为输入项的地址。该函数的功能是从文件指针fp所指的文本文件中读取数据,按格式控制字符串format给定的格式赋予输入项arg1,arg2,……,argn中。

    函数返回值:如果该函数执行成功,返回读取项目个数;如果遇到文件末尾,返回EOF;如果赋值失败,返回0.

    具体格式:

    fscanf(fp,"%s",s[i]);    //读取字符串存入数组
    
    展开全文
  • c语言文件读写函数

    2014-09-28 12:32:14
    字符读写函数:(fgetc和fputc) fputc函数:把一个字符写到磁盘文件上。具体格式如下:fputc(ch,fp) fgetc函数:从磁盘文件读取一个字符。其格式如下:ch=fgetc(fp) 字符串读写函数:(fgets和fputs) fputs函数:...
  • C语言文件读写函数总结

    千次阅读 多人点赞 2018-04-30 23:51:59
    目录 一、字符读写 1、字符写入文件函数 fputc 2、从文件中读取字符 fgetc 二、字符串的读写 1、字符串写入文件函数 fputs ...1、格式化写入文件fprintf 2、从文件格式化读取fscanf 五、一些注意点 1、fp...

    一、字符读写

    1、字符写入文件函数 fputc

    fputc函数的原型如下:
    
        int fputc( int c, FILE *fp );
    
    参数说明:
        其中,c是要写入的字节,它虽被定义为整型,但只使用最低位的一字节,fp是文件指针。
    
    fputc的功能:
        将字节c输出至fp所指向的文件。如果成功,位置指针自动后 移1字节的位置,并且返回c;否则返回EOF。
    

     

    2、从文件中读取字符 fgetc

    fgetc函数的原型如下:
    
        int fgetc( FILE *fp );
    
    参数说明:
        其中fp为文件指针。
    
    fgetc的功能:
        从fp所指向的文件中读取一个字节,如果成功则返回读取的字节,位置指针自动后移1字节的位置;否则返回EOF。

     

    二、字符串的读写

    1、字符串写入文件函数 fputs

    fputs函数的原型如下:
    
        int fputs( const char *s, FILE *fp );
    
    参数说明:
        其中,s是要写入的字符串,fp是文件指针。
    
    fputs的功能:
        将字符串s输出至fp所指向的文件(不含'\0')。如果成功,位置指针自动后移,函数返回一个非负整数;否则返回EOF。

     

    2、从文件中读取字符 fgets

    fgets函数的原型如下:
    
        char *fgets( char *s, int n, FILE *fp );
    
    参数说明:
        其中,s指向待赋值字符串的首地址,n是控制读取个数的参数,fp为文件指针。 
    
    fgets的功能:
        从位置指针开始读取 一行或n-1个字符,并存入s,存储时自动在字符串结尾加上'\0'。如果函数执行成功,位置指针自动后移,
    并返回s的值,否则返回NULL。

     

    三、块数据读写

    所谓块读写,就是读写n块以m个字节为单位的二进制数据,可以是一个字符(一个字符为一字节,则块大小为1*1),可以是一个长度为n字符串(块大小1*n),可以是长度为n的整型数组(整型以4字节算,块大小4*n),也可以是结构体等任意数据类型,并没有什么限制。

    1、向文件中写入块数据fwrite

    fwrite函数的原型如下:
    
        size_t fwrite ( void * ptr, size_t size, size_t count, FILE *fp );
    
    参数说明:
        ptr:指向保存读写数据的内存的指针,它可以指向数组、变量、结构体等。
        size:表示每个数据块的字节数。
        count:表示要读写的数据块的块数。
        fp:表示文件指针。
        理论上,每次读写 size*count 个字节的数据。
    
    fwrite的功能:
        从内存中的ptr指向的地址开始,将连续n*size字节的内容写入fp文件中。该函数的返回值是实际写入的数据块个数。

     

    2、从文件中读取块数据fread

    fread函数的原型如下:
    
        size_t fread ( void *ptr, size_t size, size_t count, FILE *fp );
    //size_t 是在 stddef.h 头文件中使用 typedef 定义的数据类型,表示无符号整数,也即非负数,常用来表示数量。
    
    参数说明:
        见fwrite
    
    fread的功能:
        从文件fp中,连续读取n*size字节的内容,并存入ptr指向的内存空间。该函数的返回值是实际读入的数据块个数。

     

    四、格式化读写

    格式化读写函数包括fprintf和fscanf两个函数,它们只用于文本文件的读写,不能用于二进制文件的读写。文本文件与二进制文件的区别下面注意点中有介绍。

    1、格式化写入文件fprintf

    fprintf函数的原型如下:
    
        int fprintf( FILE *fp, const char* format, 输出参数1, 输出参数2… );
    
    参数说明:
        其中,fp是文件指针,format为格式控制字符串,输出参数列表为待输出的数据。 
    
    fprintf的功能:
        根据指定的格式(format参数)发送数据(输出参数)到文件fp。

    例:

    #include <stdio.h>
      
    int main()
    {
        FILE *fp;
        fp = fopen("a.txt","w");
        int a = 10;
        double f = 11.11;
        fprintf(fp, "%d%lf", a, f);
        fclose(fp);
        return 0;
    }
    
    注意:fprintf()按格式输入到流,其用法和printf()相同,不过不是写到控制台,而是写到流罢了。注意的是
    返回值为此次操作写入到文件的字节数。如int c =fprintf(fp, "%s %s %d %f", str1,str2, a, b) ;
    假设str1:10字节;str2:10字节;a:2字节;b:8字节;则最终c为33,因为写入时不同的数据间自动加入一个空格。

     

    2、从文件中格式化读取fscanf

    fscanf函数的原型如下:
    
        int fscanf( FILE *fp,  const char* format, 地址1,地址2… );
    
    函数说明:
        其中,fp是文件指针,format为格式控制字符串,地址列表为输入数据的存放地址。 
    
    fscanf的功能:
        根据指定的格式(format参数)从文件fp中读取数据至内存(地址)。

    例:

    #include <stdio.h>
      
    int main()
    {
        FILE *fp;   
        fp = fopen("a.txt","r"); //需要创建a.txt文件,然后写入两个数据,空格隔开
        int i=0;
        double f=0;
        fscanf( fp, "%d%lf", &i, &f );
        fclose(fp);
        printf("%d\n%lf\n",i,f);
        return 0;
    }
    

    五、一些注意点

    (上面的都是网上抄的,下面的是我自己总结的,大佬们有砖的话轻点拍)

    1、fputc和fgetc注意点

    fputc 每次只能存一个字节,如果将整型、浮点型等数据类型入文件(因为整型浮点型每个数据都需要好几个字节,由于平台不同不固定,具体自己查不列出),就会造成数据只截取最后一个字节导致数据出错;同理fgetc每次也只能读取一个字节。这时用 fprintf 和 fscanf 函数格式化读写比较合适。

    fgetc 每次调用只能获取一个字节,如果是中文字符,utf8 编码会占用三个字节,因此要用 fgets 来读取。当然你不嫌累也可以用 fgetc 读三次,然后拼成一个中文字符。

     

    2、fputs和fgets注意点

    fgets 有局限性,每次最多只能从文件中读取一行内容,因为 fgets 遇到换行符就结束读取。如果希望读取多行内容,需要使用 fread 函数;相应地写入函数为 fwrite。

     

    3、fwrite和fread注意点

    fwrite和fread直接读写二进制文本。

    Ⅰ、这里有人可能有疑问,二进制文件和文本文件有什么区别?

    参考:

    1、https://www.zhihu.com/question/19971994

    2、https://www.cnblogs.com/zhangjiankun/archive/2011/11/27/2265184.html

            直观上的区别是:文本文件打开后我们可以看懂,而二进制文件打开会是一堆“乱码”。但是,其实所有的文件在计算机中都是二进制,导致“乱码”是因为编码上不同。

            举个例子,比如在代码中的整型数65,用fwrite方式写入文件,我们打开文件时就会惊奇的发现,文件中并不是65,而是一个大写的 'A' 。而我们用fprintf却不会出现这个问题,65还是65。这是为什么呢?

            因为fwrite是直接将数据65写进了文件,而fprintf是将65拆成两个字符,‘6’和‘5’,‘6’和‘5’在ASCII编码表中分别是54和53,于是将54和53写进文件。写进文件后我们再来看打开文件时发生了什么?

            文件软件首先将文件中的数据读进内存,然后再将内存中的数据根据这个文本软件设置的编码格式(比如utf-8)进行解码。来看fwrite写入的文件,文件软件读到 '65' 后去编码表中找到对应数据,是 'A' 然后就将 'A' 输出到屏幕上;再看用fprintf写入的文件,文件软件读到 '54' 和 '53' 后去编码表中找到对应数据,是 '6' 和 '5' ,因此最终我们在屏幕上看到的是65。

            更详细的解释去看我发的参考链接,可能讲的更清楚。

    注:上面直观上的区别说法不是很准确。当读写采用不同编码表时就会产生乱码,比如你是以utf-8格式写入文件,然后将文件软件换个编码格式,比如 "GB2312" ,这时再打开也会是乱码,根本原因是相同的字符在不同编码中的编号是不同的,比如 "你" 字,"utf-8" 中的编码为e4 bd a0,而在 "GB2312" 中的编码为 c4 e3,你用e4 bd a0在 "GB2312" 为编码下打开,就会在 "GB2312" 中去找对应的字符,那么当然不会是 "你" 字了,也就会产生乱码。

     

    Ⅱ、fopen函数中以文本方式与二进制方式打开文件的区别

    参考:https://blog.csdn.net/recsysml/article/details/44195793

    a、Windows平台下 
    如果以“文本”方式打开文件,当读取文件的时候,系统会将所有的"/r/n"转换成"/n";当写入文件的时候,系统会将"/n"转换成"/r/n"写入。 
    如果以"二进制"方式打开文件,则读/写都不会进行这样的转换。 

    b、在Unix/Linux平台下

    “文本”与“二进制”模式没有区别。

    读写二进制文件,在fopen函数中mode的参数要加上“b”,用来告诉函数库打开的文件为二进制文件,而非纯文字文件。不过在POSIX系统,包含Linux下会忽略该字符。

     

    Ⅲ、了解了文本方式与二进制方式区别我们来总结一下分别是哪些函数使用

    a、文本方式读写:fprintf/fscanf

    b、二进制方式读写:fgetc/fputc、fgets/fputs、fread/fwrite

     

    另:fwrite/fread与write/read的区别:

    https://blog.csdn.net/ljlstart/article/details/49535005

     

    4、fprintf和fscanf注意点

    fscanf将读取的ascii码转换成二进制放到内存中,效率略低;fgetc fputc 都是按照字节存取,无论文本模式还是二进制模式打开,都按照一个一个字节读取,不存在\r\n问题。

    还有一点是很多网站中文转utf-8的编码转换,utf-8编码是错的,它上面其实显示出来的是unicode编码,把我搞混好长时间。

     

     

    六、代码实例

    附上我的测试实例,有空的话自己打开一个个开关,编译运行看是否符合自己预期

    #include <stdio.h>
    #include <string.h>
    
    typedef struct 
    {
        char str1[6];
        char str2[6];
        char str3[6];    
    }STRS;
    
    
    int main()
    {
        FILE *fp;
        /*
         * fputc
         */
    
    #if 0
        fp = fopen("a.txt","w");
        //char a[3] = "你";
        //fputc(a[0],fp);
        //fputc(a[1],fp);
        //fputc(a[2],fp);
        int a=33;
        fputc(a,fp);
        fclose(fp);
    #endif
    
        /*
         * fgetc
         */
    
    #if 0 
        fp = fopen("a.txt","r");
        char c1 = fgetc(fp);
        char c2 = fgetc(fp);
        fclose(fp);
        printf("%c\n%c\n",c1,c2);
    #endif
    
        /*
         * fputs
         */
        
    #if 0
        fp = fopen("b.txt","w");
        char *s = "你好";
        fputs(s, fp);
        fclose(fp);
    #endif
    
        /*
         * fgets
         */
    
    #if 0
        fp = fopen("b.txt","r");
        STRS Strs;
        STRS *strs = &Strs;
    	    
        char hello1[6] = "hello";
        char hello3[6] = {'n','i','h','a','o'};
     
        memset(strs->str1,0,6);
        memcpy(strs->str1,hello1,6);
        memset(strs->str3,0,6);
        memcpy(strs->str3,hello3,6);
        //注意1:fgetc只能获取一位char字符,如果是中文字符,需要占三位char字符,因此要用fgets来读取;
        //注意2:读取的数据的长度要小于等于字符数组长度-1,因为字符串最后要存放'\0'。例如现在str2的长度为6,就会导致strs->str2最后不能加上‘\0’,从而会越界,连带输出str3,最终输出你好hello
        memset(strs->str2,0,6);
        fgets(strs->str2,7,fp);
        
        memset(strs->str3,0,6);
        memcpy(strs->str3,hello3,6);
        
        printf("%s\n",strs->str2);
        fclose(fp);
    #endif
    
        /*
         * fprintf
         */
    
    #if 0
        fp = fopen("c.txt","w");
        int b = 65;
        //double f = 1.11;
        //char s[3] = "你";
        //fprintf(fp, "%s", s);
        fprintf(fp, "%d", b);
        //fprintf(fp, "%d %lf", a, f);
        fclose(fp);
    #endif
    
        /*
         * fscanf
         */
    
    #if 0
        fp = fopen("c.txt","r+"); //需要创建a.txt文件,然后写入两个数据,空格隔开
        //int i=0;
        //double f=0;
        //fscanf( fp, "%d%lf", &i, &f );
        //printf("%d\n%lf\n",i,f);
        char c;
        fscanf( fp, "%c", &c);
        printf("%c\n",c);
        fclose(fp);
        
        fp = fopen("c.txt","r+");
        int fscanf_int;
        fscanf( fp, "%d", &fscanf_int );
        printf("%d",fscanf_int);
        fclose(fp);
    #endif
    #if 0
        fp = fopen("e.txt","r");
        double a = 0;
        fscanf( fp, "%lf", &a);
        fclose(fp);
        printf("%lf\n",a);
    #endif
         
        /*
         * fwrite
         */
        
    #if 0
        fp = fopen("e.txt","wb");
        //char array[3] = "你";
        //fwrite(array, sizeof(char), 3, fp);
        //double array[3] = {1.11, 2.22, 3.33};
        //fwrite(array, sizeof(double), 3, fp);
        //double a = 3.14159;
        //fwrite(&a, sizeof(double), 1, fp);
        char a=65;
        fwrite(&a, sizeof(char), 1, fp);
        fclose(fp);
    #endif
    
        /*
         * fread
         */
        
        /*
        fp = fopen("e.txt","rb");
        double array[3];
        fread(array, sizeof(double), 3,fp);
        fclose(fp);
        for(int i=0;i<3;i++)
        {
    	printf("%lf\n",array[i]);
        }
        */
    
        return 0;
    }

     

    展开全文
  • 就可以执行对文件的读和写 下面按文件的性质分 类进行操作 针对文本文件和二进制文件的不同性质 对文本文件来说 可按字符读写或按 字符串读写对二进制文件来说可进行成块的读写格式化的读写 1. 读写字符 C 提供 ...
  • C语言文件读写操作

    2014-04-11 14:04:00
    C语言实现文件读写,注意区分几个方法: 写入: fwrite() //个人认为这个最好,可是实现写入任何数据类型,任何长度 fputs() //写入一个字符串,字符串长度不能太长,具体的长度未知,但估计和文件一行有关 ...
  • C语言文件读写-判断文件是否结束 在读文件的时候,很重要的一个条件是:文件是否结束,因为文件已经结束了,就不用继续读文件了。 判断文件结束,有许多方式,比如读取文本文件和二进制文件就可以使用不同的方式,...
  • 转载from:https://www.cnblogs.com/home123/p/8318903.html 参考:... 一.非标准文件读写 不带缓冲的 ...1.文件的打开和关闭 ...open()函数的作用是打开文件,其调用格式为: int open(char ...
  • C语言文件读写操作详解

    千次阅读 2016-03-24 14:28:35
    C语言/C++中文帮助文档免积分下载(点击跳转) ...对二进制文件来说,可进行成块的读写格式化的读写。 1. 读写字符  C提供fgetc和fputc函数对文本文件进行字符的读写,其函数的原型存于stdio.h
  • C语言文件读写总结

    2015-04-03 10:18:00
    文件格式化输入输出函数 fscanf fprintf4.文件的数据块输入输出函数 fread fwrite 1.文件的字符输入输出函数 fgetc fputc fgetc从文件读取一个字符数据: c = fgetc (fp); fputc将一个字符写...
  • 文件的基本概念 文件打开函数 读字符函数 写字符函数 读字符串函数 写字符串函数 数据块读写函数 格式读写函数
  • 非标准文件读写 不带缓冲的1.文件的打开和关闭open()函数的作用是打开文件,其调用格式为: int open(char *filename, int access); 该函数表示按access的要求打开名为filename的文件,返回值为文件描述字,其中acc...
  • C语言文件的相关操作文件的介绍文件的打开和关闭字符读写函数字符串读写函数格式化的读写函数二进制的读写函数文件定位标准I/O是会分配缓存的。文件的介绍:1:文件的概念所谓“文件”是指一组相关数据的有序集合,这...
  • C语言读写SGY格式的地震数据文件.地震勘探野外采集的数据,以及经过资料处理获得的三维数据 体,只要是放在计算机里,都是以二进制文件的形式存放的。这些文 件的处理显示等工作,一般都可以用商业化的软件进行。...
  • C语言文件格式读写

    千次阅读 2017-09-28 15:18:59
    // a+ 打开一个文本文件,允许读写文件。如果文件不存在,则会创建一个新文件。 // 读取会从文件的开头开始,写入则只能是追加模式。 // a 打开一个文本文件,以追加模式写入文件。如果文件不存在,则会创建一个新...
  • 本文主要介绍C语言 格式读写文件,这里提供了关于格式读写文件的基本资料及实现示例代码,有兴趣的小伙伴可以参考下,以便理解学习
  • C语言把磁盘文件看成是字符(或字节)的序列,按照存储信息的形式来说,文件主要是有文本文件和二进制文件。文本文件由一个个字符组成,每个字节存放一个ASCII码制,代表一个字符。二进制文件把内存中的数据按其在...
  • 关于C语言文件读写

    万次阅读 多人点赞 2018-03-25 14:21:24
    C语言文件读写 字符读写 1、fputc()函数; 2、fgetc()函数 字符串读写 1、fputs()函数 2、fgets()函数 数据块读写 1、 fread()数据块读函数 2、fwrite()数据块写函数 格式读写 1、fprintf()函数 2、...
  • C语言文件读写

    2020-02-26 11:35:51
    对文件的读和写是最常见的文件操作,在C语言中提供了多种文件读写的函数: 1.字符读写函数:fgetc 和 fputc 2.字符串读写函数:fgets 和 fputs 3.字符块读写函数: fread 和 fwrite 4.格式化读写函数: fscanf 和 ...
  • C语言格式读写文件

    2018-10-18 17:45:47
    C语言格式读写文件 fscanf() 和 fprintf() 函数与前面使用的 scanf() 和 printf() 功能相似,都是格式读写函数,两者的区别在于 fscanf() 和 fprintf() 的读写对象不是键盘和显示器,而是磁盘文件。 这两个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 570
精华内容 228
关键字:

c语言文件读写格式

c语言 订阅