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.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()来判定到底出现了什么情况。