参考链接: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[] = {};
UINT32 iFileDescription = ;
UINT8 szAlphabeticSet[] = {};
UINT32 iLoopFlg = ;
UINT32 iCharCount = ;
UINT8 *pIdentify = NULL; // fopen
fp = fopen("Example.txt", "r"); // 在当前工程目录下有一个有具体内容的文件Example.txt
if (fp == NULL)
{
printf("Open the file failed!\n");
return ;
} // fgetc
if ((cSingleChar = fgetc(fp)) != EOF)
{
printf("%c\n", cSingleChar);
fclose(fp); // 只读取第一个字符
}
else
{
printf("The file is empty!\n");
fclose(fp);
} // fgets
fgets(szString, , fp);
if (strlen(szString) != )
{
printf("%s\n", szString);
}
else
{
printf("The file is empty!\n"); }
fclose(fp); // fputc
for (iLoopFlg = ; iLoopFlg < ; iLoopFlg ++)
{
cSingleChar = fputc(szAlphabeticSet[iLoopFlg], fp);
if (cSingleChar == EOF)
{
printf("Input %c to file failed!\n", szAlphabeticSet[iLoopFlg]);
fclose(fp);
return ;
}
}
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 ;
}
printf("Input to file successfully! Content = %s.\n", szAlphabeticSet);
fclose(fp); // fread
iCharCount = fread(szAlphabeticSet, , , fp);
if (iCharCount == EOF)
{
printf("Read from file failed!\n");
fclose(fp);
return ;
}
printf("Read from file successfully! Content = %s.\n", szAlphabeticSet);
fclose(fp); // fseek
iFileDescription = fseek(fp, , SEEK_SET);
if (iFileDescription == )
{
printf("offset = %d\n", ftell(fp));
}
fclose(fp); // fwrite
iCharCount = fwrite(szAlphabeticSet, , , fp);
if (iCharCount == EOF)
{
printf("Write into file failed!\n");
fclose(fp);
return ;
}
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 ;
} // 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 ;
} // putc
cSingleChar = putc('a', fp);
if (cSingleChar == EOF)
{
printf("Input to file failed!\n");
fclose(fp);
return ;
}
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 ;
}
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 ;
} return ;
}

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

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

    一.代码规范: 1.变量命名(让人一眼看它是什么意思,要做什么操作),定义并初始化 2.函数命名规范(函数的功能)在主函数之前进行声明. 在实际项目中,一般不在函数调用者的内部来对被调函数进行声明,而 ...

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

    原文地址:让你提前认识软件开发(13):指针及结构体的使用 CSDN博客 https://blog.csdn.net/zhouzhaoxiong1227/article/details/2387299 ...

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

     Contents: 1.配置文件(通常以 ini 结尾) 2.makefile文件 (Linux) PS: 这篇文章的内容,不太理解. 一.配置文件 本文以一个实际的小软件为例,介绍了C语言中配置文 ...

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

    参考:   让你提前认识软件开发(8):memset()与memcpy()函数  https://blog.csdn.net/zhouzxi/article/details/22478081 让你提前 ...

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

    参考: https://blog.csdn.net/zhouzhaoxiong1227/article/details/22820533 一..初始化数组变量 在实际的软件开发项目中,变量在使用前应初 ...

  6. 【阅读笔记】《C程序员 从校园到职场》第八章 算法和协议(Part 2)

    原文链接: 让你提前认识软件开发(19):C语言中的协议及单元测试示例 CSDN博客 https://blog.csdn.net/zhouzhaoxiong1227/article/details/2 ...

  7. 【阅读笔记】《C程序员 从校园到职场》第四章 变量和函数

    参考: Contents: 一.数据类型(对基本数据类型进行重定义——规范化) 二.变量和函数  (命名规则,注意事项) 三.静态变量及其使用 一.数据类型(对基本数据类型进行重定义——规范化) 1. ...

  8. 《C程序猿从校园到职场》带领大家从校园走向职场

    七夕节刚过.就有好消息传来:本人新书<C程序猿从校园到职场>正式出版并在各大电商平台上发售了! 以下.让我们一起来赞赏一下纸质书的"风採"吧. 本书文件夹 第1章 概述 ...

  9. 《C程序猿从校园到职场》勘误

    (本人正在參加2015博客之星评选.诚邀你来投票,谢谢:username=zhouzxi">http://vote.blog.csdn.net/blogstar2015/candida ...

随机推荐

  1. 微信小程序scroll-view不能实现下拉刷新

    一般在列表展示页面,会使用到上拉加载和下拉刷新功能,在scroll-view中有bindscrolltolower事件,可以实现上拉加载功能,但是却没法实现下拉刷新. 如需同时使用两种功能,解决步骤如 ...

  2. php – Laravel 5查询关系导致“调用成员函数addEagerConstraints()on null”错误( 转载)

    php – Laravel 5查询关系导致“调用成员函数addEagerConstraints()on null”错误   我一直在尝试创建一个简单的用户管理系统,但在查询关系时不断遇到障碍.例如,我 ...

  3. hive sql执行的job在map时报java.lang.OutOfMemoryError的错误

    较为详细且重要的一段报错信息是org.apache.hadoop.mapred.YarnChild: Error running child : java.lang.OutOfMemoryError: ...

  4. SVN在update的时候报错Please execute the 'Cleanup' command.

    需要右键clearn up 然后再update

  5. AES,BigInteger,MD5加密

    http://tool.oschina.net/apidocs/apidoc?api=jdk-zh package cn.com.gome.cashier.web; import java.lang. ...

  6. SD卡与FAT32系统学习

    2011-06-06 23:04 前2天,我了解了一下SD卡驱动的原理及FAT32文件系统的结构.接着准备主要已移植为主.通过LCD显示SD卡中的图片.但我需要分步进行. 0,使sd卡能读写数据.1, ...

  7. C++引用和const引用、常量指针、指针常量

    1.引用.常量引用 引用主要被用做函数的形式参数--通常将类对象传递给一个函数. 引用在内部存放的是一个对象的地址,它是该对象的别名.引用不占用内存,因为取地址引用的值和被引用变量的地址相同.但是ob ...

  8. 知识点补充 set 深浅拷贝

    一 对前面知识点的补充 1.str中的join()方法是将列表转换成字符串 lst = ["韩雪","赵丽颖","黄渤","李连杰 ...

  9. Why Choose MB SD C5 with Engineer Software

    MB SD C5 with engineer software performed good and now is released. Unlike the old clone C5 which us ...

  10. jquery单击事件的写法

    方式一: //点击要素,修改URL $(document).on('click',"#modUrlYs" ,function (){ //$("#modUrlYs&quo ...