文件操作函数的案例分析

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值