【阅读笔记】《C程序员 从校园到职场》第六章 常用文件操作函数 (Part 1)

参考链接:https://blog.csdn.net/zhouzhaoxiong1227/article/details/24926023

让你提前认识软件开发(18):C语言中常用的文件操作函数总结及使用方法演示代码 - CSDN博客



Contents:

1. C语言中常用的文件操作函数总结

(1) fopen   作用:打开文件

(2) fclose  作用:关闭文件

(3) fgetc   作用:由文件中读取一个字符。

(4) fgets   作用:由文件中读取一字符串。

(5) fflush  作用:更新缓冲区。

(6) fputc    作用:将一指定字符写入文件流中。

(7) fputs  作用:将一指定的字符串写入文件内。

(8) fread     作用:从文件流读取数据。

(9) fseek     作用:移动文件流的读写位置。

(10) ftell     作用:取得文件流的读取位置。

(11) fwrite    作用:将数据写至文件流。

(12) getc     作用:由文件中读取一个字符。

(13) getchar  作用:由标准输入设备内读进一字符。

(14) gets     作用:由标准输入设备内读进一字符串。

(15) putc     作用:将一指定字符写入文件中。

(16) putchar  作用:将指定的字符写到标准输出设备。

(17) feof      作用:检查文件流是否读到了文件尾。

(18) clearer   作用:清除文件流的错误旗标。

2. C语言中常用的文件操作函数的使用方法演示



1. C语言中常用的文件操作函数总结

(1) fopen

作用:打开文件。

表头文件:#include <stdio.h>

定义函数:FILE *fopen(const char *path, const char *mode);

函数说明:参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态。

mode有下列几种形态字符串:

r:打开只读文件,该文件必须存在。

r+:打开可读写的文件,该文件必须存在。

w:打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。

w+:打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。

a:以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。

a+:以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。

上述的形态字符串都可以再加一个b字符,如rb、w+b或ab+等组合,加入b字符用来告诉函数库打开的文件为二进制文件,而非纯文字文件。

不过在POSIX系统,包含Linux都会忽略该字符。由fopen()所建立的新文件会具有S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666)权限,此文件权限也会参考umask值。

返回值:文件顺利打开后,指向该流的文件指针就会被返回。如果文件打开失败,则返回NULL,并把错误代码存在errno中。

附加说明:一般而言,打开文件后会作一些文件读取或写入的动作,若打开文件失败,接下来的读写动作也无法顺利进行,所以在fopen()后请作错误判断及处理。

(2) fclose

作用:关闭文件

表头文件:#include <stdio.h>

定义函数:int fclose(FILE *stream);

函数说明:fclose()用来关闭先前fopen()打开的文件。此动作会让缓冲区内的数据写入文件中,并释放系统所提供的文件资源。

返回值:若关闭文件动作成功则返回0,有错误发生时则返回EOF并把错误代码存到errno中。

错误代码:EBADF表示参数stream非已打开的文件。

(3) fgetc

作用:由文件中读取一个字符。

表头文件:include <stdio.h>

定义函数:int fgetc(FILE *stream);

函数说明:fgetc()从参数stream所指的文件中读取一个字符。若读到文件尾而无数据时便返回EOF。

返回值:getc()会返回读取到的字符,若返回EOF则表示到了文件尾。

EOF:

在C语言中,或更精确地说成C标准函数库中表示文件结束符(end of file)。在while循环中以EOF作为文件结束标志,这种以EOF作为文件结束标志的文件,必须是文本文件。

在文本文件中,数据都是以字符ASCII代码值的形式存放。我们知道,ASCII代码值的范围是0~127,不可能出现-1,因此可以用EOF作为文件结束标志

(4) fgets

作用:由文件中读取一字符串。

表头文件:include<stdio.h>

定义函数:char *fgets(char *s, int size, FILE *stream);

函数说明:fgets()用来从参数stream所指的文件内读入字符并存到参数s所指的内存空间,直到出现换行字符、读到文件尾或是已读了size-1个字符为止,最后会加上NULL作为字符串结束。

返回值:fgets()若成功则返回s指针,返回NULL则表示有错误发生。

(5) fflush

作用:更新缓冲区。

表头文件:#include <stdio.h>

定义函数:int fflush(FILE *stream);

函数说明:fflush()会强迫将缓冲区内的数据写回参数stream指定的文件中。如果参数stream为NULL,fflush()会将所有打开的文件数据更新。

返回值:成功返回0,失败返回EOF,错误代码存于errno中。

错误代码:EBADF参数stream指定的文件未被打开,或打开状态为只读。

(6) fputc

作用:将一指定字符写入文件流中。

表头文件:#include <stdio.h>

定义函数:int fputc(int c, FILE *stream);

函数说明:fputc会将参数c转为unsigned char后写入参数stream指定的文件中。

返回值:fputc()会返回写入成功的字符,即参数c。若返回EOF,则代表写入失败。

(7) fputs

作用:将一指定的字符串写入文件内。

表头文件:#include <stdio.h>

定义函数:int fputs(const char *s, FILE *stream);

函数说明:fputs()用来将参数s所指的字符串写入到参数stream所指的文件内。

返回值:若成功,则返回写入的字符个数,返回EOF则表示有错误发生。

(8) fread

作用:从文件流读取数据。

表头文件:#include <stdio.h>

定义函数:size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

函数说明:fread()用来从文件流中读取数据。

参数stream为已打开的文件指针,

参数ptr指向欲存放读取进来的数据空间,

读取的字符数以参数size*nmemb来决定。

fread()会返回实际读取到的nmemb数目,如果此值比参数nmemb来得小,则代表可能读到了文件尾或有错误发生,这时必须用feof()ferror()来决定发生了什么情况。

返回值:返回实际读取到的nmemb数目。

(9) fseek

作用:移动文件流的读写位置。

表头文件:#include <stdio.h>

定义函数:int fseek(FILE *stream, long offset, int whence);

函数说明:fseek()用来移动文件流的读写位置。参数stream为已打开的文件指针,参数offset为根据参数whence来移动读写位置的位移数。

参数whence为下列其中一种:

SEEK_SET:从距文件开头offset位移量为新的读写位置,SEEK_CUR以目前的读写位置往后增加offset个位移量,SEEK_END将读写位置指向文件尾后再增加offset个位移量。

当whence值为SEEK_CUR 或SEEK_END时,参数offset允许负值的出现。

下列是较特别的使用方式:

1) 欲将读写位置移动到文件头时:fseek(FILE *stream, 0, SEEK_SET);

2) 欲将读写位置移动到文件尾时:fseek(FILE *stream, 0, SEEK_END);

返回值:当调用成功时,则返回0,若有错误,则返回-1,errno会存放错误代码。

附加说明:fseek()不像lseek()会返回读写位置,因此必须使用ftell()来取得目前读写的位置。

(10) ftell

作用:取得文件流的读取位置。

表头文件:#include <stdio.h>

定义函数:long ftell(FILE * stream);

函数说明:ftell()用来取得文件流目前的读写位置,参数stream为已打开的文件指针。

返回值:当调用成功时则返回目前的读写位置,若有错误则返回-1,errno会存放错误代码。

错误代码:EBADF 参数stream无效或可移动读写位置的文件流。

(11) fwrite

作用:将数据写至文件流。

表头文件:#include <stdio.h>

定义函数:size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

函数说明:fwrite()用来将数据写入文件流中。参数stream为已打开的文件指针,参数ptr指向欲写入的数据地址,总共写入的字符数以参数size*nmemb来决定。fwrite()会返回实际写入的nmemb数目。

返回值:返回实际写入的nmemb数目。

(12) getc

作用:由文件中读取一个字符。

表头文件:#include <stdio.h>

定义函数:int getc(FILE *stream);

函数说明:getc()用来从参数stream所指的文件中读取一个字符。若读到文件尾而无数据时,便返回EOF。虽然getc()与fgetc()作用相同,但getc()为宏定义,非真正的函数调用。

返回值:getc()会返回读取到的字符,若返回EOF则表示到了文件尾。

(13) getchar

作用:由标准输入设备内读进一字符。

表头文件:#include <stdio.h>

定义函数:int getchar(void);

函数说明:getchar()用来从标准输入设备中读取一个字符,然后将该字符从unsigned char转换成int后返回。

返回值:getchar()会返回读取到的字符,若返回EOF则表示有错误发生。

附加说明:getchar()非真正函数,而是getc(stdin)宏定义。

(14) gets

作用:由标准输入设备内读进一字符串。

表头文件:#include <stdio.h>

定义函数:char *gets(char *s);

函数说明:gets()用来从标准设备读入字符并存到参数s所指的内存空间,直到出现换行字符或读到文件尾为止,最后加上NULL作为字符串结束。

返回值:gets()若成功则返回s指针,返回NULL则表示有错误发生。

附加说明:由于gets()无法知道字符串s的大小,必须遇到换行字符或文件尾才会结束输入,因此容易造成缓冲溢出的安全性问题。建议使用fgets()取代。

(15) putc

作用:将一指定字符写入文件中。

表头文件:#include <stdio.h>

定义函数:int putc(int c, FILE *stream);

函数说明:putc()会将参数c转为unsigned char后写入参数stream指定的文件中。虽然putc()与fputc()作用相同,但putc()为宏定义,非真正的函数调用。

返回值:putc()会返回写入成功的字符,即参数c。若返回EOF则代表写入失败。

(16) putchar

作用:将指定的字符写到标准输出设备。

表头文件:#include <stdio.h>

定义函数:int putchar(int c);

函数说明:putchar()用来将参数c字符写到标准输出设备。

返回值:putchar()会返回输出成功的字符,即参数c。若返回EOF,则代表输出失败。

附加说明:putchar()非真正函数,而是putc(c, stdout)宏定义。

(17) feof

作用:检查文件流是否读到了文件尾。

表头文件:#include <stdio.h>

定义函数:int feof(FILE * stream);

函数说明:feof()用来侦测是否读取到了文件尾,尾数stream为fopen()所返回之文件指针。如果已到文件尾,则返回非零值,其他情况返回0。

返回值:返回非零值代表已到达文件尾。

(18) clearer

作用:清除文件流的错误旗标。

表头文件:#include <stdio.h>

定义函数:void clearer(FILE *stream);

函数说明:clearerr()清除参数stream指定的文件流所使用的错误旗标。

返回值:无。

2. C语言中常用的文件操作函数的使用方法演示

假设在当前工程目录下有一个有具体内容的文件Example.txt,则利用文件操作函数对其进行各种操作的演示如下代码所示(注意:如果要测试某一个或几个函数,只需要提取其中的部分代码即可):

/**********************************************************************
*版权所有 (C)2014, Zhou Zhaoxiong。
*文件名称: TestFileOperation.c
*文件标识:无
*内容摘要:对C语言中常用的文件操作函数进行测试
*其它说明:无
*当前版本: V1.0
*作   者: Zhou Zhaoxiong
*完成日期: 20140503
*

*修改记录1://修改历史记录,包括修改日期、版本号、修改人及修改内容
*修改日期: 20140503
*版本号: V1.0
*修改人: Zhou Zhaoxiong
*修改内容:创建
**********************************************************************/

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

// 数据类型
typedef unsigned char       UINT8;
typedef unsigned int        UINT32;
/**********************************************************************
*功能描述:主函数
*输入参数:无
*输出参数:无
*返回值:0-执行成功  1-执行失败
*其它说明:无
*修改日期         版本号    修改人           修改内容
* ----------------------------------------------------------------------------------------------

*20140503        V1.0     Zhou Zhaoxiong       创建

***********************************************************************/

UINT32 main(void)
{
    FILE  *fp   = NULL;
    UINT8 cSingleChar = ‘\0‘;
    UINT8 szString[100] = {0};
    UINT32 iFileDescription = 0;
    UINT8  szAlphabeticSet[30] = {0};
    UINT32 iLoopFlg  = 0;
    UINT32 iCharCount  = 0;
    UINT8 *pIdentify  = NULL; 

    // fopen
    fp = fopen("Example.txt", "r");    // 在当前工程目录下有一个有具体内容的文件Example.txt
    if (fp == NULL)
    {
        printf("Open the file failed!\n");
        return 1;
    }

    // fgetc
    if ((cSingleChar = fgetc(fp)) != EOF)
    {
        printf("%c\n", cSingleChar);
        fclose(fp);                   // 只读取第一个字符
    }
    else
    {
        printf("The file is empty!\n");
        fclose(fp);
    }

    // fgets
    fgets(szString, 100, fp);
    if (strlen(szString) != 0)
    {
        printf("%s\n", szString);
    }
    else
    {
        printf("The file is empty!\n");

    }
    fclose(fp);   

    // fputc
    for (iLoopFlg = 0; iLoopFlg < 27; iLoopFlg ++)    {
        cSingleChar = fputc(szAlphabeticSet[iLoopFlg], fp);
        if (cSingleChar == EOF)
        {
            printf("Input %c to file failed!\n", szAlphabeticSet[iLoopFlg]);
            fclose(fp);
            return 1;
        }
    }
    printf("Input to file successfully!\n");
    fclose(fp);

    // fputs
    iCharCount = fputs(szAlphabeticSet, fp);
    if (iCharCount == EOF)
    {
        printf("Input %s to file failed!\n", szAlphabeticSet);
        fclose(fp);
        return 1;
    }
    printf("Input to file successfully! Content = %s.\n", szAlphabeticSet);
    fclose(fp);

    // fread
    iCharCount = fread(szAlphabeticSet, 1, 26, fp);
    if (iCharCount == EOF)
    {
        printf("Read from file failed!\n");
        fclose(fp);
        return 1;
    }
    printf("Read from file successfully! Content = %s.\n", szAlphabeticSet);
    fclose(fp);

    // fseek
    iFileDescription = fseek(fp, 5, SEEK_SET);
    if (iFileDescription == 0)
    {
        printf("offset = %d\n", ftell(fp));
    }
    fclose(fp);

    // fwrite
    iCharCount = fwrite(szAlphabeticSet, 1, 26, fp);
    if (iCharCount == EOF)
    {
        printf("Write into file failed!\n");
        fclose(fp);
        return 1;
    }
    printf("Write into file successfully! Content = %s.\n", szAlphabeticSet);
    fclose(fp);

    // getc
    cSingleChar = getc(fp);
    if (cSingleChar != EOF)
    {
        printf("The got char is %c.\n", cSingleChar);
        fclose(fp);                   // 只读取第一个字符
    }
    else
    {
        printf("The file is empty!\n");
        fclose(fp);
        return 1;
    }

    // getchar与putchar
    cSingleChar = getchar();
    putchar(cSingleChar);
    printf("\n");

    // gets
    pIdentify = gets(szAlphabeticSet);
    if (pIdentify != NULL)
    {
        printf("The got string is %s.\n", szAlphabeticSet);
    }
    else
    {
        printf("Get string from scream failed!\n");
        return 1;
    }

    // putc
    cSingleChar = putc(‘a‘, fp);
    if (cSingleChar == EOF)
    {
        printf("Input to file failed!\n");
        fclose(fp);
        return 1;
    }
    printf("Input to file successfully!\n");
    fclose(fp);

    // putc与putchar
    cSingleChar = putc(‘a‘, fp);
    if (putchar(cSingleChar) == EOF)
    {
        printf("Input to scream failed!\n");
        return 1;
    }
    printf("\n");
    printf("Input to scream successfully!\n");

    // getc
    cSingleChar = getc(fp);
    if (cSingleChar != EOF)
    {
        printf("The got char is %c.\n", cSingleChar);
        fclose(fp);                   // 只读取第一个字符
    }
    else
    {
        printf("The file is empty!\n");
        fclose(fp);
        return 1;
    }

    return 0;
}

原文地址:https://www.cnblogs.com/hhxxgdd/p/8973752.html

时间: 2024-07-29 01:43:27

【阅读笔记】《C程序员 从校园到职场》第六章 常用文件操作函数 (Part 1)的相关文章

【阅读笔记】《C程序员 从校园到职场》第二章 学校到职场

一.代码规范: 1.变量命名(让人一眼看它是什么意思,要做什么操作),定义并初始化 2.函数命名规范(函数的功能)在主函数之前进行声明. 在实际项目中,一般不在函数调用者的内部来对被调函数进行声明,而是将声明放在外部(新建一个.h文件,对程序中出现的函数进行声明) 3.代码排版(主要涉及缩进.空格.空行.括号位置) 4.程序注释(版本信息.修改记录),函数注释(函数的功能.输入输出值.返回值.修改记录). 5.关于输入输出,开发中会有专门的消息处理流程(不一定非有 printf.scanf.ma

《C程序员从校园到职场》勘误

(本人正在参加2015博客之星评选,诚邀你来投票,谢谢:http://vote.blog.csdn.net/blogstar2015/candidate?username=zhouzxi) 自从<C程序员从校园到职场>一书上市以来,受到了大家的欢迎,很多读者通过各种途径向我反馈了读书心得,在此表示感谢.但"金无赤足,人无完人",书中的内容也存在一些纰漏.本文用于持续收集目前发现的本书的一些问题,也希望大家将对本书的一些意见或改进建议及时告知我. 本书的勘误如下: 1.P5,

【阅读笔记】《C程序员 从校园到职场》第六章 配置文件,makefile 文件 (Part 2)

 Contents: 1.配置文件(通常以 ini 结尾) 2.makefile文件 (Linux) PS: 这篇文章的内容,不太理解. 一.配置文件 本文以一个实际的小软件为例,介绍了C语言中配置文件的读取方法和重要的文件操作函数的使用方法,为相关软件开发项目提供了有益的参考 参考链接:让你提前认识软件开发(12):配置文件读取及文件操作 CSDN博客 https://blog.csdn.net/zhouzhaoxiong1227/article/details/23552667 2.4本文中

【阅读笔记】《C程序员 从校园到职场》第七章 指针和结构体

原文地址:让你提前认识软件开发(13):指针及结构体的使用 CSDN博客 https://blog.csdn.net/zhouzhaoxiong1227/article/details/23872995 [文章摘要] 指针在C语言中占有很重要的地位,同时也是学习C语言的难点所在.结构体属于用户自己建立的数据类型,在实际的软件开发项目中应用很广泛. 本文以实际的例子介绍了C语言中指针和结构体的使用方法,为进一步的学习和应用提供了有益的参考. [关键词] C语言 指针  结构体 文件 1.指针和结构

【阅读笔记】《C程序员 从校园到职场》第五章 内存操作

参考:   让你提前认识软件开发(8):memset()与memcpy()函数  https://blog.csdn.net/zhouzxi/article/details/22478081 让你提前认识软件开发(10):字符串处理函数及异常保护 https://blog.csdn.net/zhouzxi/article/details/22976307 一.memset  &  memcpy 1. memset()函数 (1)函数原型         void *memset( void *d

【阅读笔记】《C程序员 从校园到职场》第三章 程序的样式(大括号)

参考: https://blog.csdn.net/zhouzhaoxiong1227/article/details/22820533 一..初始化数组变量 在实际的软件开发项目中,变量在使用前应初始化,防止未经初始化的变量被引用. 对于数组变量来说,恰当的初始化样例如下:           char szString[100] = {0}; 定义了一个名为szString的包含100个字节的数组变量,并将该数组中每个变量的初始值赋为0. 二. 定义和初始化结构体变量 结构体变量的定义方法的

C语言编程标准 ----自《C程序员从校园到职场》

/*************************************************** * 版权所有   公司或者个人名称 * * 文件名称: * 内容摘要: * 其他说明: * 当前版本: * 作     者: * 完成日期: * * 修改记录1: *    修改日期: *    版 本  号: *    修 改  人: *    修改内容: * * 修改记录2: *    修改日期: *    版 本  号: *    修 改  人: *    修改内容: ********

C 内存操作 ---自《C程序员从校园到职场》

1.  memset  and memcpy /**********************************************/ 2. strcat and strncat /*********************************************/ 3.strcpy and strncpy /*********************************************/ 4.strcmp and strncmp

【读书笔记】程序员的自我修养总结(六)

[读书笔记]程序员的自我修养总结(六) 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 说明:这是程序员的自我修养一书的读书总结,随着阅读的推进,逐步增加内容. 本文主要介绍可执行文件的装载与进程 程序与进程的区别 程序是静态的,指的是一些预先编译好的指令和数据集合的一个文件:而进程实际上就是运行着的程序,是动态的. 虚拟地址空间 程序运行起来后将拥有独立的虚拟地址空间 virtual address space,其大小由计算机的硬件平台决定,具体地说是