编程杂谈

格式化读写‘fscanf()’、’fprintf()’格式化读‘fsanf()’用于从指定文件中读取格式化字符串。#include<stdio.h>...intfscanf(FILE*stream,constchar*format,...);用法:跟scanf()一样,只是多了stream参数fscanf(fp,"%d-%d-%d",&year,&month,&day);返回值调用成功,返回值是成功获取并填充到附加参数中的个数。调用失败,返回值小于附加参数的个数(甚至是0)。如果读取到标准输入流的结尾处,则返回EOF。格式化读‘fprintf()’用于打印格式化字符串到指定的文件。#include<stdio.h>...intfprintf(FILE*stream,constchar*format,...);用法:跟printf()一样,只是多了stream参数fprintf(fp,"IloveYou!\n");fprintf(fp,"Todayis%d-%d-%d\n",2021,1,22);返回值调用成功,返回值是实际打印的字符数(不包含表示字符串结束的‘\0’);调用失败,返回值是一个负数。实例格式化文件读写#include<stdio.h>#include<stdlib.h>#definePATH"./lines.txt"intmain(void){//打开文件FILE*fpw=fopen(PATH,"w");if(fpw==NULL)exit(1);//文件写入打开失败//格式化写入文件fprintf(fpw,"Todayis%d-%d-%d\n",2021,1,22);//关闭文件fclose(fpw);//打开文件FILE*fpr=fopen(PATH,"r");if(fpr==NULL)exit(2);//文件读取打开失败//读取文件intyear,month,day;fscanf(fpr,"Todayis%d-%d-%d",&year,&month,&day);printf("%d-%d-%d\n",year,month,day);//关闭读取文件fclose(fpr);return0;}二进制读写‘fread()’、’fwrite()’格式化读‘fread()’用于从指定的文件中读取指定尺寸的数据。#include<stdio.h>...size_tfread(void*ptr,size_tsize,size_tnmemb,FILE*stream);参数:ptr:指向存放数据空间的指针,该内存块的尺寸最小应该是size*nmemb个字节size:要读取的每个元素的尺寸nmemb:要读取的元素个数stream:是一个FILE对象的指针返回值成功:实际读取到的元素个数(nmemb);失败:返回比nmemb参数的值小,表示可能读取到文件末尾或者有错误发生(可以使用feof函数或ferror函数进一步判断)。格式化读‘fwrite()’将指定尺寸的数据写入到指定的文件中。#include<stdio.h>...size_tfwrite(constvoid*ptr,size_tsize,size_tnmemb,FILE*stream);参数:ptr:指向存放数据空间的指针,该内存块的尺寸最小应该是size*nmemb个字节size:要写入的每个元素的尺寸nmemb:要写入的元素个数stream:是一个FILE对象的指针返回值成功:返回实际写入到文件中的元素个数(nmemb);失败:如果返回值与nmemb参数的值不同,则有错误发生。实例#include<stdio.h>#include<stdlib.h>#definePATH"data.txt"structData{intyear;intmonth;intday;};intmain(void){//打开文件FILE*fpw=fopen(PATH,"w");if(fpw==NULL)exit(1);//打开写入文件失败//以二进制形式写入结构体到文件structData*data_write=(structData*)malloc(sizeof(structData));data_write->year=2021;data_write->month=1;data_write->day=21;fwrite(data_write,sizeof(structData),1,fpw);free(data_write);//关闭文件fclose(fpw);//打开文件FILE*fpr=fopen(PATH,"r");if(fpw==NULL)exit(2);//打开读取文件失败//以二进制形式读取文件structData*data_read=(structData*)malloc(sizeof(structData));fread(data_read,sizeof(structData),1,fpr);printf("%d-%d-%d\n",data_read->year,data_read->month,data_read->day);free(data_read);return0;}

编程杂谈

打开文件&关闭文件打开文件需要文件指针接收;关闭文件需要传入文件指针FILE*fp;//定义文件指针打开文件使用到的函数fopen()#include<stdio.h>FILE*fopen(constchar*path,constchar*mode);参数参数含义*path文件的路径,支持相对路径、绝对路径*mode指定文件打开的模式:r、w、a、r+、w+、a+b:以二进制形式打开文件,可以与上面的6种结合("rb","wb","ab","r+b","w+b","a+b")返回值打开成功,则返回一个指向FILE结构的文件指针;打开失败,则返回NULL并设置errno为指定的错误。打开文件模式文件打开模式说明“r”1.以只读的模式打开一个文本文件,从文件头开始读取2.该文本文件必须存在“w”1.以只写的模式打开一个文本文件,从文件头开始写入2.如果文件不存在则创建一个新的文件3.如果文件已存在则将文件的长度截断为0(重新写入的内容将覆盖原有的所有内容)“a”1.以追加的模式打开一个文本文件,从文件末尾追加内容2.如果文件不存在则创建一个新的文件“r+”1.以读和写的模式打开一个文本文件,从文件头开始读取和写入2.该文件必须存在3.该模式不会将文件的长度截断为0(只覆盖重新写入的内容,原有的内容保留)“w+”1.以读和写的模式打开一个文本文件,从文件头开始读取和写入2.如果文件不存在则创建一个新的文件3.如果文件已存在则将文件的长度截断为0(重新写入的内容将覆盖原有的所有内容)“a+”1.以读和追加的模式打开一个文本文件2.如果文件不存在则创建一个新的文件3.读取是从文件头开始,而写入则是在文件末尾追加“b”1.与上面6中模式均可结合(”rb”,“wb”,“ab”,“r+b”,“w+b”,“a+b”)关闭文件使用到的函数fclose()#include<stdio.h>intfclose(FILE*fp);参数参数含义fp指向一个待关闭的文件指针返回值:关闭成功,返回值是0;关闭失败,返回值是EOF,并设置errno为指定的错误。备注:磁盘已满、设备出错或者I/O错误均可能导致fclose函数调用失败。实例(打开文件&关闭文件)#include<stdio.h>#include<stdlib.h>intmain(void){FILE*fp;//定义文件指针//打开文件fp=fopen("data.txt","r");if(fp==NULL){printf("打开文件失败!!!\n");exit(EXIT_FAILURE);};//关闭文件if(fclose(fp)!=EOF){printf("关闭文件成功~~~");exit(EXIT_SUCCESS);};return0;}文件读写字符读写字符读‘fgetc()’、’getc()’fgetc()说明#include<stdio.h>...intfgetc(FILE*stream);参数说明:stream该参数是一个FILE对象的指针,指定一个待读取的文件流返回值:成功:将读取到的unsignedchar类型转换为int类型并返回;失败:如果文件结束或者遇到错误则返回EOF。getc()说明fgetc()、getc()两个的功能和描述基本上是一模一样的,它们的区别主要在于实现上:fgetc()是一个函数;而getc()则是一个宏的实现实例#include<stdio.h>#include<stdlib.h>intmain(){//定义文件指针FILE*fp;//打开文件if((fp=fopen("./data.txt","r"))==NULL){//文件打开失败exit(EXIT_FAILURE);}//读取文件的内容charch;while((ch=fgetc(fp))!=EOF){putchar(ch);;}//关闭文件流fclose(fp);return0;}字符写‘fputc()’、’putc()’将一个字符写入到指定的文件中并推进文件的位置指示器(用来指示接下来要读写的下一个字符的位置)。fputc()说明#include<stdio.h>...intfputc(intc,FILE*stream);参数说明:c:指定待写入的字符stream:该参数是一个FILE对象的指针,指定一个待写入的文件流返回值:成功:返回写入的字符;失败:如果文件结束或者遇到错误则返回EOF。putc()说明fputc()、putc()两个的功能和描述基本上是一模一样的,它们的区别主要在于实现上:fputc()是一个函数;而putc()则是一个宏的实现实例#include<stdio.h>#include<stdlib.h>intmain(){//定义文件指针FILE*fp;//打开文件if((fp=fopen("./data.txt","w"))==NULL){//文件打开失败exit(EXIT_FAILURE);}//写入一个字符charch='A';if(fputc(ch,fp)==EOF){//写入失败exit(EXIT_FAILURE);};//关闭文件流fclose(fp);return0;}字符串读写字符读‘fgets()’用于从指定文件中读取字符串。最多可以读取size-1个字符,因为结尾处会自动添加一个字符串结束符'\0'。当读取到换行符('\n')或文件结束符(EOF)时,表示结束读取('\n'会被作为一个合法的字符读取)。fgets()说明#include<stdio.h>...char*fgets(char*s,intsize,FILE*stream);参数说明:s:字符型指针,指向用于存放读取字符串的位置size:指定读取的字符数(包括最后自动添加的‘\0’)stream:该参数是一个FILE对象的指针,指定一个待操作的数据流返回值:成功:返回s参数指向的地址失败:如果在读取字符的过程中遇到EOF,则eof指示器被设置;如果还没读入任何字符就遇到这种EOF,则s参数指向的位置保持原来的内容,函数返回NULL。如果在读取的过程中发生错误,则error指示器被设置,函数返回NULL,但s参数指向的内容可能被改变。实例#include<stdio.h>#include<stdlib.h>#defineMAX1024intmain(){//打开文件FILE*fp;if((fp=fopen("./data.txt","r"))==NULL){exit(1);}//读取文件chars[MAX];if(fgets(s,MAX,fp)==NULL){//读取失败exit(2);};printf("%s",s);//输出读取内容//关闭文件fclose(fp);return0;}字符写‘fputs()’fputs函数用于将一个字符串写入到指定的文件中,表示字符串结尾的‘\0’不会被一并写入fputs()说明#include<stdio.h>...intfputs(constchar*s,FILE*stream);参数说明:s:字符型指针,指向用于存放待写入字符串的位置stream:是一个FILE对象的指针,指定一个待操作的数据流返回值:成功:返回一个非0值失败:返回EOF实例#include<stdio.h>#include<stdlib.h>intmain(void){//打开文件FILE*fp;if((fp=fopen("./data.txt","w"))==NULL){exit(1);//打开文件失败};//写入内容chars[]="iloveyou***";if(fputs(s,fp)!=0){exit(2);//写入失败}//关闭失败fclose(fp);return0;}