您的位置:首页 > 其它

文件操作函数的案例分析

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.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()来判定到底出现了什么情况。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: