fgetc和fputc、fgets和fputs、fscanf和fprintf用法解释及测试代码

一:fgetc和fputc

1.fgetc函数

函数原型:int fgetc(FILE *stream)

参数:*stream: 文件指针,将要读取的文件流。
返回值:fgetc returns the character read as an int or returns EOF to indicate an error or end of file.

fgetc返回作为读取的字符int或返回EOF以指示错误或文件结尾。

功能:读取文件指针stream所指文件的当前读指针位置的一个字符。使用fgetc读取一个字节后,文件指针的位置会自动后移一个字节。

Function Required header
fgetc <stdio.h>
#include<stdio.h>
#include<string.h>

int main()
{
    char setData[]="This is a test of fgetc!",c;
    FILE *fp;
    ///打开一个空文件以更新此文件的数据
    fp=fopen("test01.txt","w+");
    ///将字符串写入这个文件
    fwrite(setData,strlen(setData),1,fp);
    //size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);
    //(1)buffer:是一个指针,对fwrite来说,是要获取数据的地址;
    //(2)size:要写入内容的单字节数;
    //(3)count:要进行写入size字节的数据项的个数;
    //(4)stream:目标文件指针;
    //(5)返回实际写入的数据项个数count。

    ///寻找文件的起始位置
    fseek(fp,0,SEEK_SET);
    //int fseek( FILE *stream, long offset, int origin );
    //第一个参数stream为文件指针
    //第二个参数offset为偏移量,正数表示正向偏移,负数表示负向偏移
    //第三个参数origin设定从文件的哪里开始偏移,可能取值为:SEEK_SET(或0)、SEEK_CUR(或1)、 SEEK_END(或2)
    //SEEK_SET: 文件开头
    //SEEK_CUR: 当前位置
    //SEEK_END: 文件结尾
    //其中SEEK_SET,SEEK_CUR和SEEK_END依次为0,1和2.
    while(c!=EOF)
    {
        c=fgetc(fp);
        //fgetc返回作为读取的字符int或返回EOF以指示错误或文件结尾。
        //fgetc读取一个字节后,文件指针fp的位置自动后移一个字节。
        printf("%c",c);
    }
    fclose(fp);
}

2.fputc函数

函数原型:int fputc (int c, FILE *fp)

参数:c:字符的ASCII编码值;*fp: 文件指针,将要读取的文件流。

返回值:在正常调用情况下,函数返回写入文件的字符的ASCII码值,出错时,返回EOF(-1)。

功能:将ASCII编码值为c的字符写到文件指针fp所指向的文件的当前写指针的位置。使用fputc时,当正确写入一个字符或一个字节的数据后,文件指针会自动后移一个字节的位置。

Function Required header
fputc <stdio.h>
#include<stdio.h>

int  main()
{
    FILE *fp;
    ///打开一个空文件以更新此文件的数据
    fp=fopen("test02.txt","w+");
    ///寻找文件的起始位置
    //虽然此时文件指针就在起始位置,但为避免在比较复杂的程序中出错(即文件指针所指的地址错误),推荐每次在使用fputc和fgetc函数时都寻找一下文件位置。
    fseek(fp,0,SEEK_SET);
    ///使用putc函数向文件中写入一个字符'a'
    fputc('a',fp);
    ///寻找文件的起始位置
    fseek(fp,0,SEEK_SET);
    ///打印刚才写入文件里的字符
    printf("%c",fgetc(fp));
    fclose(fp);
}

二:fgets和fputs

1.fgets函数

函数原型:char *fgets(char *buf, int bufsize, FILE *stream);

参数:*buf: 字符型指针,指向用来存储所得数据的地址。bufsize: 整型数据,指明存储数据的大小。*stream: 文件指针,将要读取的文件流。

返回值:成功,则返回第一个参数buf;在读字符时遇到end-of-file,则eof指示器被设置,如果还没读入任何字符就遇到这种情况,则buf保持原来的内容,返回NULL;如果发生读入错误,error指示器被设置,返回NULL,buf的值可能被改变。

功能:fgets函数用来从流中读取字符串。

注意:fgets函数的调用形式如下:fgets(str,n,fp);此处,fp是文件指针;str是存放在字符串的起始地址;n是一个int类型变量。函数的功能是从fp所指文件中读入n-1个字符放入str为起始地址的空间内;如果在未读满n-1个字符之时,已读到一个换行符或一个EOF(文件结束标志),则结束本次读操作,读入的字符串中最后包含读到的换行符。因此,确切地说,调用fgets函数时,最多只能读入n-1个字符。读入结束后,系统将自动在最后加'\0',并以str作为函数值返回。

如果使用fgets()读取某个文件,第一次读取的bufsize为5,而文件的第一行有10个字符(算上'\n'),那么读取文件的指针会偏移至当前读取完的这个字符之后的位置。也就是第二次再用fgets()读取文件的时候,则会继续读取其后的字符。而,如果使用fgets() 读取文件的时候bufsize大于该行的字符总数加2(多出来的两个,一个保存文件本身的'\n'换行,一个保存字符串本身的结束标识'\0'),文件并不会继续读下去,仅仅只是这一行读取完,随后指向文件的指针会自动偏移至下一行。

Function Required header
fgets <stdio.h>
#include<stdio.h>
#include<string.h>

int main()
{
    FILE *fp;
    char setData[]="This is a test of fgets!",showData[100];
    ///打开一个空文件以更新此文件的数据
    fp=fopen("test03.txt","w+");
    ///向test03.txt中写入setData字符串
    fwrite(setData,strlen(setData),1,fp);
    ///寻找文件的起始位置
    fseek(fp,0,SEEK_SET);
    ///将test03.txt中的字符串存到showData里
    fgets(showData,strlen(setData)+1,fp);
    ///打印结果
    puts(showData);
    fclose(fp);
}

2.fputs函数

函数原型:int fputs(const char *str, FILE *stream);

参数:str:这是一个数组,包含了要写入的以空字符终止的字符序列。stream:指向 FILE 对象的指针,该 FILE 对象标识了要被写入字符串的流

返回值:该函数返回一个非负值,如果发生错误则返回 EOF(-1)。

功能:把字符串写入到指定的流( stream) 中,但不包括空字符。

Function Required header
fputs <stdio.h>
#include<stdio.h>
#include<string.h>

int main()
{
    FILE *fp;
    ///打开一个空文件
    fp=fopen("test04.txt","w+");
    char setData[]="This is a test of fputs!",showData[100];
    fseek(fp,0,0);
    ///写入数据
    fputs(setData,fp);
    fseek(fp,0,0);
    ///读取数据
    fgets(showData,strlen(setData)+1,fp);
    ///输出结果
    puts(showData);
    fclose(fp);
}

三:fscanf和fprintf

1.fscanf函数

函数原型:int fscanf ( FILE * stream, const char * format, [argument...]);

参数:stream:文件指针、format:格式字符串、[argument...]:输入列表

返回值:整型,成功返回读入的参数的个数,失败返回EOF(-1)。

功 能: 在一个流中进行格式化读取数据,fscanf遇到空格和换行时结束,注意空格时也结束。这与fgets有区别,fgets遇到空格不结束。

Function Required header
fscanf <stdio.h>

#include<stdio.h>
#include<string.h>

int main()
{
    int show_a;
    double show_b;
    char show_s[100];
    ///打开一个空文件
    FILE *fp=fopen("test05.txt","w+");
    fseek(fp,0,0);
    ///格式化向文件中写入数据
    fprintf(fp,"%d %lf %s",10,6.6,"This_is_a_test_of_fscanf!");
    fseek(fp,0,0);
    ///格式化从文件中读取数据
    fscanf(fp,"%d %lf %s",&show_a,&show_b,show_s);
    ///输出结果
    printf("%d\n%lf\n%s",show_a,show_b,show_s);
    fclose(fp);
}
2.fprintf函数

函数原型:int fprintf (FILE* stream, const char*format, [argument])

参数:stream:文件指针、format:输出格式、[argument]:附加参数列表

返回值:On success, the total number of characters written is returned. If a writing error occurs, the error indicator (ferror) is set and a negative number is returned. If a multibyte character encoding error occurs while writing wide characters, errno is set to EILSEQ and a negative number is returned.

在成功的情况下,返回的字符总数。如果发生写入错误,将设置错误指示符(ferror)并返回一个负数。如果在写入宽字符时出现多字节字符编码错误,则将errno设置为EILSEQ,并返回一个负数。

功能:在一个流中进行格式化写入数据。

Function Required header
fprintf <stdio.h>
#include<stdio.h>
#include<string.h>

int main()
{
    int a=10,show_a;
    double b=6.6,show_b;
    char c[]="This_is_a_test_of_fprintf!",show_s[100];
    ///打开一个空文件
    FILE *fp=fopen("test05.txt","w+");
    fseek(fp,0,0);
    ///格式化向文件中写入数据
    fprintf(fp,"%d %lf %s",a,b,c);
    fseek(fp,0,0);
    ///格式化从文件中读取数据
    fscanf(fp,"%d %lf %s",&show_a,&show_b,show_s);
    ///输出结果
    printf("%d\n%lf\n%s",show_a,show_b,show_s);
    fclose(fp);
}

猜你喜欢

转载自blog.csdn.net/coco56/article/details/80725091
今日推荐