文件操作函数的案例分析
2015-07-24 23:29
246 查看
sscanf可以支持格式字符%[]:
**(1)-: 表示范围,如:%[1-9]表示只读取1-9这几个数字 %[a-z]表示只读取a-z小写字母,类似地 %[A-Z]只读取大写字母
(2)^: 表示不取,如:%[^1]表示读取除’1’以外的所有字符 %[^/]表示除/以外的所有字符
(3),: 范围可以用”,”相连接 如%[1-9,a-z]表示同时取1-9数字和a-z小写字母
(4)原则:从第一个在指定范围内的数字开始读取,到第一个不在范围内的数字结束%s 可以看成%[] 的一个特例 %^ **
标准输入stdin、
标准输出stdout
标准出错 stderr。
函数解释
1,功能:按照mode 规定的方式,打开由path指定的文件。若找不到由path指定的相应文件,就按以下方式之一处理:
(1) 写方式打开文件,就按由path指定的名字建立一个新文件;
(2) 读方式打开文件,就会产生一个错误。
2.打开文件的作用是:
(1)分配给打开文件一个FILE 类型的文件结构体变量,并将有关信息填入文件结构体变量;
(2)开辟一个缓冲区;
(3)调用操作系统提供的打开文件或建立新文件功能,打开或建立指定文件;
FILE *:指出fopen是一个返回文件类型的指针函数;
3.参数说明
path:是一个字符指针,它将指向要打开或建立的文件的文件名字符串。
mode:是一个指向文件处理方式字符串的字符指针。具体就去问man吧
4.返回值
正常返回:被打开文件的文件指针。
异常返回:NULL,表示打开操作不成功。
功能:关闭由fp指出的文件。此时调用操作系统提供的文件关闭功能,关闭由fp->fd指出的文件;释放由fp指出的文件类型结构体变量;返回操作结果,即0或EOF。
说明:fp:一个已打开文件的文件指针。
正常返回:0。
异常返回:EOF,表示文件在关闭时发生错误。
功能:exit()函数使程序立即终止执行,同时将缓冲区中剩余的数据输出并关闭所有已经打开的文件。
说明:status为0值表示程序正常终止,为非0值表示一个定义错误
函数解释
2. 功能说明
从fp所指文件中读取一个字符。
3. 参数说明
fp:这是个文件指针,它指出要从中读取字符的文件。
4. 返回值
正常返回: 返回读取字符的代码。
非正常返回:返回EOF。例如,要从”写打开”文件中读取一个字符时,会发生错误而返回一个EOF。
2. 功能说明
把由s指出的字符串写入到fp所指的文件中去。
3. 参数说明
s:指出要写到文件中去的字符串。
stream:这是个文件指针,指出字符串要写入其中的文件。
4. 返回值
正常返回: 写入文件的字符个数,即字符串的长度。
非正常返回:返回一个NULL值,此时应当用feof()或ferror()函数来判别是读取到了文件尾,还是发生了错误。例如,要往一个”读打开” 文件中写字符串时,会发生错误而返回一个NULL值。
fflush(stdout)刷新标准输出缓冲区,把输出缓冲区里的东西打印到标准输出设备上。
scanf()函数接收输入数据时,遇以下情况结束一个数据的输入:(不是结束该scanf函数,scanf函数仅在每一个数据域均有数据,并按回车后结 束)。
① 遇空格、“回车”、“跳格”键。
② 遇宽度结束。
③ 遇非法输入。
键盘缓冲区就可能有残余信息问题。
scanf()函数应该只是扫描stdin流,这个残存信息是在stdin中
解决就要在scanf()函数之后加个fflush(stdin)
函数解释:
作用是格式化字符串
(1)将数字变量转换为字符串。
(2)得到整型变量的16进制和8进制字符串。
(3)连接多个字符串
作用:将参数str的字符串根据参数format字符串来转换并格式化数据,转换后的结果存于对应的参数内
(1)根据格式从字符串中提取数据。如从字符串中取出整数、浮点数和字符串等。
(2)取指定长度的字符串
(3)取到指定字符为止的字符串
(4)取仅包含指定字符集的字符串
(5)取到指定字符集为止的字符串
功能:在文本文件(ASCII文件)中可以用值为-1的符号常量EOF来作为文件的结束符。但是在二进制文件中-1往往可能是一个有意义的数据,因此不能用它 来作为文件的结束标志。为了能有效判别文件是否结束,ANSI C提供了标准函数feof(),用来识别文件是否结束。
说明:返回为非0值,已到文件尾。返回为0值,表示还未到文件尾。
第一个参数FILE指针
第二个参数移动的偏移量
第三个参数移动到哪里
分别用3个宏
SEEK_SET 既0 文件开头
SEEK_CUR 既1 文件当前位置
SEEK_END 既2 文件结尾
但不推荐用数字 最好用宏
例如:fseek(fp,100L,SEEK_SET);把fp指针移动到离文件开头100字节处;
2. 功能说明
按二进制形式,将由ptr指定的数据缓冲区内的nmemb个数据写入由stream指定的文件中去。
3. 参数说明
ptr:这是一个void型指针,指出要将其中数据输出到文件的缓冲区首地址。
size:指出一个数据块的字节数,即一个数据块的大小尺寸。
nmemb:一次输出多少个数据块(size)。
stream:这是个文件指针,指出要从其中读出数据的文件。
4.返回值
正常返回:实际输出数据块的个数,即nmemb。
异常返回:返回0值,表示输出结束或发生了错误。
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
2. 功能说明
从由stream指定的文件中,按二进制形式将nmenb个数据读到由buffer指出的数据区中。
3. 参数说明
ptr:这是一个void型指针,指出要将读入数据存放在其中的存储区首地址。
size:指出一个数据块的字节数用(sizeof),即一个数据块的大小尺寸。
nmemb:指出一次读入多少个数据块(size)。
stream:这是个文件指针,指出要从其中读出数据的文件。
4.返回值
正常返回:实际读取数据块的个数,即nmemb。
异常返回:如果文件中剩下的数据块个数少于参数中nmemb指出的个数,或者发生了错误,返回0值。此时可以用feof()和ferror()来判定到底出现了什么情况。
**(1)-: 表示范围,如:%[1-9]表示只读取1-9这几个数字 %[a-z]表示只读取a-z小写字母,类似地 %[A-Z]只读取大写字母
(2)^: 表示不取,如:%[^1]表示读取除’1’以外的所有字符 %[^/]表示除/以外的所有字符
(3),: 范围可以用”,”相连接 如%[1-9,a-z]表示同时取1-9数字和a-z小写字母
(4)原则:从第一个在指定范围内的数字开始读取,到第一个不在范围内的数字结束%s 可以看成%[] 的一个特例 %^ **
标准输入stdin、
标准输出stdout
标准出错 stderr。
1.fopen,fclose函数的使用的使用
#include <stdio.h> #include <stdlib.h> #include <string.h> int main( void ) { FILE *fp = NULL; char name[32] = {}; double weight; if( (fp = fopen("info.txt","w")) == NULL) { fprintf(stderr,"open info.txt failed\n"); exit(1); //非0表示不正常推出,0表示正常退出。 } fprintf(stdout,"name: "); fscanf(stdin,"%s",name); fprintf(stdout,"weight: "); fscanf(stdin,"%lf",&weight); fprintf(fp,"%s %lf",name,weight); fclose(fp); }
函数解释
FILE *fopen(const char *path, const char *mode);
1,功能:按照mode 规定的方式,打开由path指定的文件。若找不到由path指定的相应文件,就按以下方式之一处理:
(1) 写方式打开文件,就按由path指定的名字建立一个新文件;
(2) 读方式打开文件,就会产生一个错误。
2.打开文件的作用是:
(1)分配给打开文件一个FILE 类型的文件结构体变量,并将有关信息填入文件结构体变量;
(2)开辟一个缓冲区;
(3)调用操作系统提供的打开文件或建立新文件功能,打开或建立指定文件;
FILE *:指出fopen是一个返回文件类型的指针函数;
3.参数说明
path:是一个字符指针,它将指向要打开或建立的文件的文件名字符串。
mode:是一个指向文件处理方式字符串的字符指针。具体就去问man吧
4.返回值
正常返回:被打开文件的文件指针。
异常返回:NULL,表示打开操作不成功。
int fclose(FILE *fp);
功能:关闭由fp指出的文件。此时调用操作系统提供的文件关闭功能,关闭由fp->fd指出的文件;释放由fp指出的文件类型结构体变量;返回操作结果,即0或EOF。
说明:fp:一个已打开文件的文件指针。
正常返回:0。
异常返回:EOF,表示文件在关闭时发生错误。
void exit(int status)
功能:exit()函数使程序立即终止执行,同时将缓冲区中剩余的数据输出并关闭所有已经打开的文件。
说明:status为0值表示程序正常终止,为非0值表示一个定义错误
2.fgetc,fputc,函数的使用
#include <stdio.h> #include <stdlib.h> #include <string.h> int main( void ) { char c; FILE *fp = fopen("fin1.c","r"); if(fp==NULL) { fprintf(stderr,"fopen fin1.c err\n"); exit(1); } while ( (c=fgetc(fp)) != EOF)//这里还可以让EOF换为-1,测试过,它的返回值就是-1的时候文件结束。 { fputc(c,stdout); fflush(stdout); //不用这个的时候为什么是读完一行才显示。 sleep(1); }
函数解释
int fgetc(FILE *fp);
2. 功能说明
从fp所指文件中读取一个字符。
3. 参数说明
fp:这是个文件指针,它指出要从中读取字符的文件。
4. 返回值
正常返回: 返回读取字符的代码。
非正常返回:返回EOF。例如,要从”写打开”文件中读取一个字符时,会发生错误而返回一个EOF。
int fputs(const char *s, FILE *stream);
2. 功能说明
把由s指出的字符串写入到fp所指的文件中去。
3. 参数说明
s:指出要写到文件中去的字符串。
stream:这是个文件指针,指出字符串要写入其中的文件。
4. 返回值
正常返回: 写入文件的字符个数,即字符串的长度。
非正常返回:返回一个NULL值,此时应当用feof()或ferror()函数来判别是读取到了文件尾,还是发生了错误。例如,要往一个”读打开” 文件中写字符串时,会发生错误而返回一个NULL值。
3.fflush函数的使用
#include <stdio.h> #include <stdlib.h> #include <string.h> int main( void ) { char name[32]; float weight; int age; fprintf(stdout,"姓名 体重 年龄:"); // fflush(stdout); sleep(2); fscanf(stdin,"%s%g%d",name,&weight,&age); fprintf(stdout,"%s %g %d\n",name,weight,age); }
int fflush(FILE *stream)
fflush(stdout)刷新标准输出缓冲区,把输出缓冲区里的东西打印到标准输出设备上。
scanf()函数接收输入数据时,遇以下情况结束一个数据的输入:(不是结束该scanf函数,scanf函数仅在每一个数据域均有数据,并按回车后结 束)。
① 遇空格、“回车”、“跳格”键。
② 遇宽度结束。
③ 遇非法输入。
键盘缓冲区就可能有残余信息问题。
scanf()函数应该只是扫描stdin流,这个残存信息是在stdin中
解决就要在scanf()函数之后加个fflush(stdin)
4.sprintf,sscanf函数的使用
字符串解析的方法:#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct stu { int id; char name[32]; float score; }stu; int main( void ) { stu s = {110,"毛毛虫",3.5}; char buf[1024]; memset(buf,0x00,sizeof(buf)); sprintf(buf,"%d|%s|%g\n",s.id,s.name,s.score); int id; char nm[32]; float sf; /* sscanf(buf,"%d|%g",&id,&sf); printf("id=%d,s=%g\n",id,sf); */ char *p=strtok(buf,"|"); //返回|以前的字符,并且把|换为\0 printf("%s\n",p); p=strtok(NULL,"|"); //strtok遇到|返回首地址给p printf("%s\n",p); p=strtok(NULL,"|"); sscanf(p,"%g",&sf); printf("%g\n",sf); }
函数解释:
int sprintf(char *str, const char *format, ...)
作用是格式化字符串
(1)将数字变量转换为字符串。
(2)得到整型变量的16进制和8进制字符串。
(3)连接多个字符串
int sscanf(const char *str, const char *format, ...)
作用:将参数str的字符串根据参数format字符串来转换并格式化数据,转换后的结果存于对应的参数内
(1)根据格式从字符串中提取数据。如从字符串中取出整数、浮点数和字符串等。
(2)取指定长度的字符串
(3)取到指定字符为止的字符串
(4)取仅包含指定字符集的字符串
(5)取到指定字符集为止的字符串
5.fscanf,fprintf的使用
#include <stdio.h> #include <stdlib.h> int main( int argc,char *argv[] ) { if(argc !=2) { fprintf(stderr,"%s file\n",argv[0]); exit(1); } FILE *fp = NULL; char buf[1024] = {}; if( (fp=fopen(argv[1],"r"))==NULL) { fprintf(stderr,"fopen %s err!\n",argv[1]); exit(2); } fscanf(fp,"%s",buf); fprintf(stdout,"%s",buf); fscanf(fp,"%s",buf); fprintf(stdout,"%s",buf); fclose(fp); }
6.getline,sleep函数的使用
int main( int argc,char *argv[] ) { if(argc !=2) { fprintf(stderr,"%s file\n",argv[0]); exit(1); } FILE *fp = NULL; char buf[1024] = {}; if( (fp=fopen(argv[1],"r"))==NULL) { fprintf(stderr,"fopen %s err!\n",argv[1]); exit(2); } char *ptr = NULL; int len; while(getline(&ptr,&len,fp) != -1) { sleep(1); printf("%s\n",ptr); } free(ptr); fclose(fp); }
ssize_t getline(char **lineptr, size_t *n, FILE *stream);
7.fseek,feof函数的使用
#include <stdio.h> #include<stdlib.h> int main( void ) { FILE *fp = NULL; char c; if((fp=fopen("text.txt","r"))==NULL) { fprintf(stderr,"fopen text.txt err"); exit(1); } /* while ((c=fgetc(fp)) != -1) { putchar(c); fflush(stdout); fseek(fp,1,SEEK_CUR); } */ while(1) { if(feof(fp)) { fprintf(stdout,"file end"); } else { c=fgetc(fp); fseek(fp,1,SEEK_CUR); fflush(stdout); sleep(1); putchar(c); } } fclose(fp); }
int feof(FILE *stream);
功能:在文本文件(ASCII文件)中可以用值为-1的符号常量EOF来作为文件的结束符。但是在二进制文件中-1往往可能是一个有意义的数据,因此不能用它 来作为文件的结束标志。为了能有效判别文件是否结束,ANSI C提供了标准函数feof(),用来识别文件是否结束。
说明:返回为非0值,已到文件尾。返回为0值,表示还未到文件尾。
int fseek(FILE *stream, long offset, int whence);
第一个参数FILE指针
第二个参数移动的偏移量
第三个参数移动到哪里
分别用3个宏
SEEK_SET 既0 文件开头
SEEK_CUR 既1 文件当前位置
SEEK_END 既2 文件结尾
但不推荐用数字 最好用宏
例如:fseek(fp,100L,SEEK_SET);把fp指针移动到离文件开头100字节处;
8.fwrite,fread函数的使用
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct person { char name[32]; int age; }person; int main( void ) { FILE *fp = fopen("per.dat","w"); if(fp == NULL) fprintf(stderr,"fopen per.dat error!\n"),exit(1); person arr[3] = {{"乔广州",18}, {"马丁国",13}, {"hehehe",43}}; fwrite(arr,sizeof(person),3,fp); //起始地址,结构体大小,要几个,写到哪 printf("sizeof(person)=%d\n",sizeof(person)); fclose(fp); FILE *fin = fopen("per.dat","r"); if(fin == NULL) { fprintf(stderr,"fopen per.dat error !\n"); exit(1); }//上面那种逗号表达式和这里的作用一样 person a[3] = {}; fread(a,sizeof(person),3,fin); //读的起始地址,结构体大小,读几个,保存到哪 int i; for(i=0;i<3;i++) { printf("%s %d\n",a[i].name,a[i].age); } fclose(fin); }
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
2. 功能说明
按二进制形式,将由ptr指定的数据缓冲区内的nmemb个数据写入由stream指定的文件中去。
3. 参数说明
ptr:这是一个void型指针,指出要将其中数据输出到文件的缓冲区首地址。
size:指出一个数据块的字节数,即一个数据块的大小尺寸。
nmemb:一次输出多少个数据块(size)。
stream:这是个文件指针,指出要从其中读出数据的文件。
4.返回值
正常返回:实际输出数据块的个数,即nmemb。
异常返回:返回0值,表示输出结束或发生了错误。
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
2. 功能说明
从由stream指定的文件中,按二进制形式将nmenb个数据读到由buffer指出的数据区中。
3. 参数说明
ptr:这是一个void型指针,指出要将读入数据存放在其中的存储区首地址。
size:指出一个数据块的字节数用(sizeof),即一个数据块的大小尺寸。
nmemb:指出一次读入多少个数据块(size)。
stream:这是个文件指针,指出要从其中读出数据的文件。
4.返回值
正常返回:实际读取数据块的个数,即nmemb。
异常返回:如果文件中剩下的数据块个数少于参数中nmemb指出的个数,或者发生了错误,返回0值。此时可以用feof()和ferror()来判定到底出现了什么情况。
相关文章推荐
- 小贝_mysql优化学习
- C++静态库与动态库
- H3C 网络设备基本调试
- linux rsync远程同步(续)
- PS简单使用
- 7月24号,本人为新手每天都会更新本天所学内容,如果有错请大神可以指出,谢谢。
- 多线程
- 素数有关算法
- 字符设备驱动、平台设备驱动、设备驱动模型、sysfs的关系
- 【外语学习】资料
- 技术生涯首篇博文
- jstl 转义字符
- [转]详解C#组件开发的来龙去脉
- poj 2353 Ministry
- ruby中数组的常用函数
- 【BI】资料收集
- gcc内嵌汇编详解
- 错误代码: 1327 Undeclared variable: p_film_count
- 扩充的数据结构-区间树interval-tree
- 错误代码: 1327 Undeclared variable: p_film_count