第一句子大全,网罗天下好句子,好文章尽在本站!

C语言这些常见标准文件该如何使用?很基础也很重要

时间:2024-01-08

注意:对于相对路径相对的是工程文件

友情提示:本文共有 6337 个字,阅读大概需要 13 分钟。

谈到文件,先了解下什么是文本文件二进制文件的区别吧!

1、文本文件:存储时是将字符的ASCII值存在磁盘中,取的时候将数值(ASCII)翻译成对应的字符;

2、二进制文件:存取的都是二进制;

文件流指针:

当打开一个文件时,系统会返回一个结构体,这个结构体有对此文件操作的所有信息

调用fopen时(fopen的返回值: 如果成功返回FILE结构体地址,失败返回NULL;

返回的文件流指针标识了打开的那个文件),系统返回这个结构体地址,比如如下所示:

FILE*P = fopen("test.txt");

说太多的东西不如代码演示一遍,代码如下所示:

#define _CRT_SECURE_NO_WARNINGS#include #include #include int main(){ // 打开一个文件,成功则返回这个FLIE结构体地址,失败则返回NULL; FILE *fp = fopen("./test.txt", "w"); if (NULL == fp) { perror(""); // 打印输错的信息 return; } fclose(fp); // 关闭文件 return 0;}

以上代码是在相对路径下执行的,为了直接在vs中调试运行。注意:对于相对路径相对的是工程文件。

设备文件:

但启动一个程序时,系统会打开三个设备文件,分别是:

1、stdin 标准输入文件:

FILE *stdin = fopen(stdin,"r")

2、stdout 标准输出文件:

FILE *stdout = fopen(stdout,"w")

3、stderr 标准错误文件:

FILE *stderr = fopen(stderr,"w")

利用fputc() 和 fgetc()读写文件:

1、fputc():

格式:

int fputc(int ch, FILE * stream);/*功能:将ch转换为unsigned char后写入stream指定的文件中参数: ch:需要写入文件的字符 stream:文件指针返回值: 成功:成功写入文件的字符 失败:返回-1*/

作用:写入一个字符到文件当中。

代码演示如下所示:

#define _CRT_SECURE_NO_WARNINGS#include #include #include int main(){ // 打开一个文件,成功则返回这个FLIE结构体地址,失败则返回NULL; FILE *fp = fopen("./test.txt", "w"); if (NULL == fp) { perror(""); // 打印输错的信息 return; } char strBuf[] = "abcde"; int n = 0; while (strBuf[n] != 0) { fputc(strBuf[n], fp); n++; } fclose(fp); // 关闭文件 return 0;}

2、fgetc():

格式

int fgetc(FILE * stream);/*功能:从stream指定的文件中读取一个字符参数: stream:文件指针返回值: 成功:返回读取到的字符 失败:-1*/

代码演示如下所示:

#define _CRT_SECURE_NO_WARNINGS#include #include #include int main(){ // 打开一个文件,成功则返回这个FLIE结构体地址,失败则返回NULL; FILE *fp = fopen("./test.txt", "r"); if (NULL == fp) { perror(""); // 打印输错的信息 return; } char strBuf[128] = ""; int n = 0; while ((strBuf[n++] = fgetc(fp)) != EOF); printf("%sn", strBuf); fclose(fp); // 关闭文件 return 0;}

在上面代码提到了用“EOF”作为文件的结尾,也要提下 feof() 这个函数的使用方法。

为什么要提到这个函数,主要是如果读取文件不是纯文本的时候,有像-1这种数字,那么就不可以使用EOF(-1)作为文件的结尾,就需要用到foef()函数。

格式:

int feof(FILE * stream);/*功能:检测是否读取到了文件结尾。判断的是最后一次“读操作的内容”,不是当前位置内容(上一个内容)。参数: stream:文件指针返回值: 非0值:已经到文件结尾 0:没有到文件结尾*/

用代码形式演示如下所示:

#define _CRT_SECURE_NO_WARNINGS#include #include #include int main(){ // 打开一个文件,成功则返回这个FLIE结构体地址,失败则返回NULL; FILE *fp = fopen("./test.txt", "r"); if (NULL == fp) { perror(""); // 打印输错的信息 return; } char strBuf[128] = ""; int n = 0; do { strBuf[n++] = fgetc(fp); } while (!feof(fp)); // 非0值读到文件末尾,取反则为未读到文件末尾 printf("%sn", strBuf); fclose(fp); // 关闭文件 return 0;}

fgets()与fputs():

1、fgets(读取字符串):

作用:从文件读取字符串,fgets读取中遇到n结束;

格式:

char * fgets(char * str, int size, FILE * stream);/*功能:从stream指定的文件内读入字符,保存到str所指定的内存空间,直到出现换行字符、读到文件结尾或是已读了size - 1个字符为止,最后会自动加上字符 "" 作为字符串结束。参数: str:字符串 size:指定最大读取字符串的长度(size - 1) stream:文件指针返回值: 成功:成功读取的字符串 读到文件尾或出错: NULL*/

2、fputs(写入字符串):

作用:向文件写入字符串;

格式:

int fputs(const char * str, FILE * stream);/*功能:将str所指定的字符串写入到stream指定的文件中,字符串结束符 "" 不写入文件。参数: str:字符串 stream:文件指针返回值: 成功:0 失败:-1*/

fprintf()与fscanf():

1、fprintf():

作用:组包函数,写文件;

格式:

int fprintf(FILE * stream, const char * format, ...);/*功能:根据参数format字符串来转换并格式化数据,然后将结果输出到stream指定的文件中,指定出现字符串结束符 "" 为止。参数: stream:已经打开的文件 format:字符串格式,用法和printf()一样返回值: 成功:实际写入文件的字符个数 失败:-1*/

2、fscanf():

作用:拆包函数(读文件):

格式:

int fscanf(FILE * stream, const char * format, ...);/*功能:从stream指定的文件读取字符串,并根据参数format字符串来转换并格式化数据。参数: stream:已经打开的文件 format:字符串格式,用法和scanf()一样返回值: 成功:参数数目,成功转换的值的个数 失败: - 1*/

fwrite()写入函数与fread()读取函数:

1、fwrite()写入函数:

格式:

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);/*功能:以数据块的方式给文件写入内容参数: ptr:准备写入文件数据的地址 size: size_t 为 unsigned int类型,此参数指定写入文件内容的块数据大小 nmemb:写入文件的块数,写入文件数据总大小为:size * nmemb stream:已经打开的文件指针返回值: 成功:实际成功写入文件数据的块数目,此值和 nmemb 相等 失败:0*/

需要注意的是:在第二个参数写1,,返回值即是写入的块数也是写入的字节数。

2、fread()读取函数:

格式:

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);/*功能:以数据块的方式从文件中读取内容参数: ptr:存放读取出来数据的内存空间 size: size_t 为 unsigned int类型,此参数指定读取文件内容的块数据大小 nmemb:读取文件的块数,读取文件数据总大小为:size * nmemb stream:已经打开的文件指针返回值:成功:实际成功读取到内容的块数,如果此值比nmemb小,但大于0,说明读到文件的结尾。 失败:0*/

文件的随机读写:

分别为三个函数:如下所示:

1、fseek():

作用:可以移动光标。

格式:

int fseek(FILE *stream, long offset, int whence);/*功能:移动文件流(文件光标)的读写位置。参数: stream:已经打开的文件指针offset:根据whence来移动的位移数(偏移量),可以是正数,也可以负数,如果正数,则相对于whence往右移动,如果是负数,则相对于whence往左移动。如果向前移动的字节数超过了文件开头则出错返回,如果向后移动的字节数超过了文件末尾,再次写入时将增大文件尺寸。 whence:其取值如下: SEEK_SET:从文件开头移动offset个字节 SEEK_CUR:从当前位置移动offset个字节 SEEK_END:从文件末尾移动offset个字节返回值: 成功:0 失败:-1*/

2、rewind():

作用:将光标移动到开头,和fseek(fp,0,SEEK_SET)一样。

格式:

void rewind(FILE *stream);/*功能:把文件流(文件光标)的读写位置移动到文件开头。参数: stream:已经打开的文件指针返回值: 无返回值*/

3、 ftell():

格式:

long ftell(FILE *stream);/*功能:获取文件流(文件光标)的读写位置。参数: stream:已经打开的文件指针返回值: 成功:当前文件流(文件光标)的读写位置 失败:-1*/

获取文件状态信息stat:

格式:

int stat(const char *path, struct stat *buf);/*功能:获取文件状态信息参数:path:文件名buf:保存文件信息的结构体返回值:成功:0失败:-1*/struct stat { dev_t st_dev; //文件的设备编号 ino_t st_ino; //节点 mode_t st_mode; //文件的类型和存取的权限 nlink_t st_nlink; //连到该文件的硬连接数目,刚建立的文件值为1 uid_t st_uid; //用户ID gid_t st_gid; //组ID dev_t st_rdev; //(设备类型)若此文件为设备文件,则为其设备编号 off_t st_size; //文件字节数(文件大小) unsigned long st_blksize; //块大小(文件系统的I/O 缓冲区大小) unsigned long st_blocks; //块数 time_t st_atime; //最后一次访问时间 time_t st_mtime; //最后一次修改时间 time_t st_ctime; //最后一次改变时间(指属性)};

代码演示一下,如下所示:

#define __CRT_SECURE_NO_WARNINGS#include#include#include#include #include int main(){ struct stat stu; int res = 0; res = stat("./test.txt", &stu); if (res < 0) { printf("没找到文件!n"); } printf("文件大小为:%dn", stu.st_size); system("pause"); return 0;}

我这个文件因为是存在,而且文件有内容,所以会打印出文件大小,如下图所示:

remove()与rename():

1、remove():

格式:

int remove(const char *pathname);/*功能:删除文件参数: pathname:文件名返回值: 成功:0 失败:-1*/

2、rename():

格式:

int rename(const char *oldpath, const char *newpath);/*功能:把oldpath的文件名改为newpath参数:oldpath:旧文件名newpath:新文件名返回值:成功:0失败: - 1*/

文件缓冲区:

注意问题:

缓冲区:就是内存中的一块临时的空间,同时普通文件刷新缓冲区的方法,有以下3种:

1、缓冲区满了;2、程序正常退出时;3、利用fflush函数强制刷新。

windows与Linux的区别:

1、Windows下标准输出stdout文件没有缓冲区;

2、Linux有缓冲区;

标准输入不能调用fflush强制刷新;

3、n换行的问题。

在windows,输入nihaon时,存储的是nihaorn,取出时是nihaon,当在Linux系统下打开windows存储的文件时,就会多了一个r。

在Linux,输入nihaon时,存储和取出都是nihaon,而在windows下打开Linux存储的文件时,发现没有换行。

本文如果对你有帮助,请点赞收藏《C语言这些常见标准文件该如何使用?很基础也很重要》,同时在此感谢原作者。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。
显示评论内容(9)
  1. 小米喳喳2024-01-19 15:20小米喳喳[国外网友]103.240.159.124
    @卡米丽希望大家都能够正确而系统地使用C语言的常见标准文件。
    顶43踩0
  2. 卡米丽2024-01-18 08:32卡米丽[河南省网友]203.27.23.78
    不要怕困难,坚持学习C语言的常见标准文件是我们提升自己的必经之路。
    顶25踩0
  3. 稥煙ⓓê寂寞2024-01-17 01:44稥煙ⓓê寂寞[黑龙江省网友]103.41.18.240
    学好C语言的基础,将对我们日后的编程技能有很大帮助。
    顶41踩0
  4. 相遇在风雨中2024-01-15 18:55相遇在风雨中[西藏网友]103.47.83.160
    如果遇到不懂的地方,可以参考在线的C语言论坛或者问问身边的同学和老师。
    顶1踩0
  5. 肖溢2024-01-14 12:07肖溢[甘肃省网友]203.174.96.67
    这些标准文件虽然看起来庞大,但是我们可以根据自己的需求有选择地查阅。
    顶2踩0
  6. 丫2024-01-13 05:19[辽宁省网友]120.95.18.31
    @珎珎我建议大家在学习C语言的初期就要详细阅读和了解这些标准文件。
    顶16踩0
  7. 珎珎2024-01-11 22:30珎珎[国外网友]103.226.116.14
    有时候,我们可能会遇到一些编译器不同的问题,这时候查阅标准文件就能解决大部分的困惑。
    顶10踩0
  8. 够钟2024-01-10 15:42够钟[黑龙江省网友]222.240.83.65
    @kg官方这些标准文件提供了有关C语言的基本语法和函数的定义,让我们能够正确使用和理解C语言。
    顶0踩0
  9. kg官方2024-01-09 08:54kg官方[河南省网友]202.14.231.245
    对于初学者来说,了解和掌握C语言的常见标准文件非常关键。
    顶0踩0
相关阅读
支招!熟悉语言习惯 读懂FIDIC合同文件

支招!熟悉语言习惯 读懂FIDIC合同文件

...就是难的句子没读懂。英语的长难句是在五种基本句式的基础上添加某些成分,改变某种顺序变化而来的。”谢亚琴表示。谢亚琴表示,从英语的5种基本句式可以看出:主、谓是句子最重要的成分,所有的基本句式中都必须有...

2023-01-17 #经典句子

海南专升本-《C语言程序设计》课程考试大纲

海南专升本-《C语言程序设计》课程考试大纲

...组等的使用等。(2)提高性要求:学生应在掌握C语言的基础知识后,能够自行设计程序解决现实中的某些实际问题。(3)技能性要求:熟悉C语言编程环境、C语言基本语法,掌握使用C语言开发应用程序的基本方法和步骤,能够...

2014-09-25 #经典句子

IP地址数据解析漏洞 多语言语言net类库受影响

IP地址数据解析漏洞 多语言语言net类库受影响

...混合格式的八进制的数据当作十进制有关。所有使用这次基础库的应用程序可能会受到不确定的服务器端请求伪造(SSRF) 和远程文件包含(RFI) 漏洞的攻击。因为该基础库被广使用,所以大量的Go,Rust网络应用都受到影响。另外,Pyth...

2013-05-03 #经典句子

只知道yyds?这些你不懂的“缩写梗” 缩写梗不是规范语言文字

只知道yyds?这些你不懂的“缩写梗” 缩写梗不是规范语言文字

...家通用语言文字工作”的进程中,必须“发挥学校教育的基础阵地作用、党政机关的带头作用、新闻媒体的示范作用、公共服务行业的窗口作用”。央视节目主持人的语音竟然“不具备标准音层面上的示范意义”,这对“推广普...

2023-06-17 #经典句子

C语言的简单了解及学习

C语言的简单了解及学习

...为了编写 UNIX 操作系统而被发明的。C 语言是以 B 语言为基础的,B 语言大概是在 1970 年被引进的。至于B语言,有兴趣的小伙伴可以自行百度。(我决不承认自己是个懒货)C 语言标准是于 1988 年由美国国家标准协会制定的。截...

2010-04-07 #经典句子

令小白头痛的C语言 到底该怎么学?

令小白头痛的C语言 到底该怎么学?

...是一门必修课,这意味着它具有课程的共性,即知识存在基础知识、重点知识和难点知识等。注意,C语言的基础知识是基本的逻辑,而不是计算机的组成原理,恰好相反的是,我们正是通过学习C语言来逐步了解计算机的原理的...

2007-11-15 #经典句子

C 语言发展史的点点滴滴

C 语言发展史的点点滴滴

...系统。1966年,马丁·理察德在剑桥大学,以CPL编程语言为基础,发明了BCPL编程语言。1.3.2 B语言之父Kenneth Lane Thompson肯尼斯·蓝·汤普逊(英语:Kenneth Lane Thompson,1943年2月4日-)小名肯·汤普逊(英语:Ken Thompson),美国计算机...

2023-01-31 #经典句子

C语言可以在执行语句中间定义变量吗?

C语言可以在执行语句中间定义变量吗?

...更多精彩内容,快来关注lemoontree在C++中(.CPP文件是按C++标准编译的),按照语法我们可以把变量定义在任何位置,只要在用到变量前对该变量进行声明定义就行了,位置不做特别要求,比如函数中任意位置出现的For循环中:好...

2023-06-19 #经典句子