C语言中的常用文件操作

原文链接

常常觉得,我对很多东西都是要求会用就好,不求甚解。比如说每次一遇到文件操作,我必要查查相关的API和例子,然后依样画葫芦写下来。或许正是因为这种不求甚解的态度,让我一直处于半桶水的状态。看完了《C专家编程》后,觉得很多东西里面有包含了很多学问;开了博之后,常常希望写点有用的东西,有点像记笔记了,呵呵。记笔记有一个好处,就是要求你必须对现有的知识进行整理,然后才能有条理地写下来。昨天写算法的时候又遇到文件操作的东西了,这次索性把相关的API都整理出来,当是记了一回笔记了。

 

在对文件进行操作之前,要先打开文件,使用完毕后,要关闭文件。文件操作相关的API如下:

 

C代码 
#include <stdio.h> 
FILE *fopen(const char *path, const char *mode);   //path表示文件路径,mode表示文件使用方式
int fclose( FILE* pf );  //成功关闭返回0,否则返回EOF,并且将错误记录在系统全局变量errno中//从stream当前位置读取一个字符
int getc(FILE *stream); 
//将c写入stream当前位置,成功返回0,否则返回EOF
int fputc(int c, FILE *stream);  
//从stream当前位置读取长度为size-1的字符串并保存于s中。成功返回s,否则返回NULL
char *fgets(char *s, int size, FILE *stream);  //将字符串写入stream
int fputs(const char *s, FILE *stream);
//读取nmemb份数据,每份大小为size,并将它们保存在ptr指向的空间。返回读取的数据大小
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); 
//从ptr指向的空间提取数据向stream写入nmemb份数据,每份大小为size,返回写入的数据大小
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
//格式读写,与标准输入输出的printf和scanf一样,只是在前面多了一个文件指针
int fprintf(FILE *stream, const char *format, ...); 
int fscanf(FILE *stream, const char *format, ...);

 

fopen返回一个称为“文件指针”的FILE*,FILE是由系统定义的一个结构,该结构中包含有文件名、文件状态、文件当前状态等相关信息。所谓打开文件,实际上是建立文件的各种有关信息,并使文件指针指向该文件,以便进行其它操作。关闭文件则断开指针与文件之间的联系,也就禁止再对该文件进行操作。

 

有关文件的使用方式有以下几点说明:

 

1. 文件使用方式由r,w,a,t,b,+六个字符拼成,各字符的含义是:
   r(read): 读
   w(write): 写
   a(append): 追加
   t(text): 文本文件,可省略不写
   b(banary): 二进制文件
   +: 读和写

2. 凡用“r”打开一个文件时,该文件必须已经存在, 且只能从该文件读出。

3. 用“w”打开的文件只能向该文件写入。 若打开的文件不存在,则以指定的文件名建立该文件,若打开的文件已经存在,则将该文件删去,重建一个新文件。

4. 若要向一个已存在的文件追加新的信息,只能用“a ”方式打开文件。但此时该文件必须是存在的,否则将会出错。

5. 在打开一个文件时,如果出错,fopen将返回一个空指针值NULL。在程序中可以用这一信息来判别是否完成打开文件的工作,并作相应的处理。

 

6. 把一个文本文件读入内存时,要将ASCII码转换成二进制码, 而把文件以文本方式写入磁盘时,也要把二进制码转换成ASCII码,因此文本文件的读写要花费较多的转换时间。对二进制文件的读写不存在这种转换。

7. 标准输入文件(键盘),标准输出文件(显示器 ),标准出错输出(出错信息)是由系统打开的,可直接使用。文件关闭函数fclose()文件一旦使用完毕,应用关闭文件函数把文件关闭, 以避免文件的数据丢失等错误。

有关文件读写的一些说明:

1. 进行读取操作时,文件必须是以读或读写方式打开的,进行写操作时,必须是以写或追加方式打开的

2. 文件内部有一个位置指针,用来指向文件当前的读写位置,在文件打开时,该指针总是指向文件的第一个字符位置。

3. 对于fgets,如果在未读完size-1个字符前就遇到了EOF或换行符,则读出结束

4. fread和fwrite可以用来从文件读取结构、写入结构

 

文件的其他操作包括:

 

C代码 
//将文件的位置指针指向由whence加上偏移offset的位置,whence可以是SEEK_SET(文件起始位置)、SEEK_CUR(当前位置)、SEEK_END(终止位置)
int fseek(FILE *stream, long offset, int whence); 
//返回文件当前位置
long ftell(FILE *stream); 
//将位置指针指向文件头,相当于fseek(stream, 0L, SEEK_SET)
void rewind(FILE *stream); 
//获取或设置文件位置指针
int fgetpos(FILE *stream, fpos_t *pos); 
int fsetpos(FILE *stream, fpos_t *pos);  

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/463749.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

圆梦,手写了个操作系统

大家好&#xff0c;我是发哥。我不止一次在公众号上强调学习操作系统的重要性。至于学习的方法&#xff0c;无外乎看书、看视频、看源码等等。也有推荐过跟着老师一起手写操作系统&#xff0c;但很少有学习方法能同时兼顾以下三点&#xff1a;1、Linux内核2、Windows内核3、自己…

Socket api接口--Send(),Recv()的长度问题

一个包没有固定长度&#xff0c;以太网限制在46&#xff0d;1500字节&#xff0c;1500就是以太网的MTU&#xff0c;超过这个量&#xff0c;TCP会为IP数据报设置偏移量进行分片传输&#xff0c;现在一般可允许应用层设置8k&#xff08;NTFS系统&#xff09;的缓冲区&#xff0c;…

安卓打包apk

打apk包的环境依赖 1.jdk 2.sdk 3.ndk 打apk包的工具 gradle mkdir /usr/local/Android cd /usr/local/Android mkdir sdk gradle ndk 1.jdk安装 略 2.sdk安装 https://www.androiddevtools.cn/下载地址 cd /usr/local/Android/sdk wget https://dl.google.com/android/andro…

收集最全的Joomla教材网站和joomla模板网站

http://www.seonote.net/joomla/the-most-complete-collection-of-joomla-sites-and-joomla-templates-website-materials.html 这篇文章算是为joomla学习者而准备的&#xff0c;包括了适合初学者学习的教材网站、国内比较好的joomla学习网 站以及几个比较好的joomla模板网站&a…

你知道怎么衡量硬件设备的算力吗?

前几天在知乎上看到有知友提问&#xff0c;什么是 GPU 算力。当时简单回答了一下&#xff0c;今天有空&#xff0c;在这里详细谈谈算力。算力也是做高性能计算的核心概念和指标。设备算力分为两部分&#xff0c;其一是设备&#xff0c;其二是算力。设备主要是指 CPU、GPU、DSP、…

socket api中send()和recv()函数工作原理与要点

send()和recv()函数是网络编程中经常使用到的函数&#xff0c;下面详细的比较两者的不同之处 send函数工作原理&#xff1a;send函数只负责将数据提交给协议层。 当调用该函数时&#xff0c;send先比较待发送数据的长度len和套接字s的发送缓冲区的长度&#xff0c;如果len大于s…

Python爬虫入门教程 22-100 CSDN学院课程数据抓取

1. CSDN学院课程数据-写在前面 今天又要抓取一个网站了&#xff0c;选择恐惧症使得我不知道该拿谁下手&#xff0c;找来找去&#xff0c;算了&#xff0c;还是抓取CSDN学院吧&#xff0c;CSDN学院的网站为 https://edu.csdn.net/courses 我看了一下这个网址&#xff0c;课程数量…

UML类图解义 (来自《大话设计模式》)

为什么80%的码农都做不了架构师&#xff1f;>>> 小菜&#xff1a;“对了&#xff0c;我时常在一些技术书中看到这些类图表示&#xff0c;简单的还看得懂&#xff0c;有些标记我很容易混淆。要不你给我讲讲吧。” 大鸟&#xff1a;“这个其实多看多用就熟悉了。我给…

易写易库(EXEK)玩“花”儿之三:命令有图标支持库,附图

释题&#xff1a;如果您认为这个“花”儿&#xff0c;属于之前第一个“花”儿的变种&#xff0c;易语言写支持库也能玩出“花”儿来&#xff08;易写易库(EXEK)进展5&#xff09;&#xff0c;我也不反对。 在开始正文之前&#xff0c;我要首先回答我之前提出的两个问题&#xf…

您好,有什么嵌入式书籍推荐的?

回答下这个后台的留言-----比较推荐下面这个仓库里面的内容&#xff01;https://github.com/ZhongYi-LinuxDriverDev/CS-EmbeddedLinux-Book#%E5%85%A8%E9%83%A8%E6%B1%87%E6%80%BB

闭包的功能举例

闭包可以在函数外部或者其他函数内,访问本函数内的变量: 闭包可以使变量持久,常驻内存,又可以避免变量被外部修改 1 def func():2 name "大傻子" #定义个name "大傻子"3 def func1():4 return name #把name返回给…

低学历者为何能骗取30万年薪职位

内容&#xff1a;<P>  在如今的职场就业中&#xff0c;高学历真的很诱人。号称是美国耶鲁大学管理学博士但只有初中毕业文凭的方某&#xff0c;能不受到高企的忠爱?在方某的精心准备&#xff0c;经历过一系列面试&#xff0c;他终于谋得了一份年薪30万的总经理助理兼人…

VS2017打开低版本的VS MVC架构的项目的时候需要修改的地方

1、需要修改的是.sln文件&#xff0c;即将里面的 Version改为12&#xff0c;其中的VS的版本改为2017 2、项目中后缀名为 .csproj中的代码改一下&#xff1a; 转载于:https://www.cnblogs.com/zhijianhao/p/10253572.html

从外部的js文件中获取ASPX页面的控件ClientID(get control reference from external javascript)...

前言 当使用MasterPage、UserControl等容器时&#xff0c;为了避免控件的重复命名&#xff0c;asp.net会自动将容器中的控件生成一个ClientID&#xff08;Control Tree中的可生成&#xff0c;否则不会生成&#xff09;。 例如&#xff1a;ContentPlaceHolder1中的Button1默认情…

[转]一个老工程师给年轻工程师的忠告

[1]好好规划自己的路&#xff0c;不要跟着感觉走&#xff01;根据个人的理想决策安排&#xff0c;绝大部分人并不指望成为什么院士或教授&#xff0c;而是希望活得滋润一些&#xff0c;爽一些。那么&#xff0c;就需要慎重安排自己的轨迹。从哪个行业入手&#xff0c;逐渐对该行…

A star算法优化一

A*算法 求最优解 算法一直维护两个表: Open和Close 将起点S加入Open中将所有S可到达的点&#xff08;障碍物以及位于Close表中的点均看成不可达&#xff09;加入到Open中。将起点从Open中删去&#xff0c;并加入到Close中①从Open中删去F值最小的点Min&#xff0c;并将其加入到…

可怕!CPU暗藏了这些未公开的指令!

我们平时编程写的高级语言&#xff0c;都是经过编译器编译以后&#xff0c;变成了CPU可以执行的机器指令&#xff1a;而CPU能支持的指令&#xff0c;都在它的指令集里面了。很久以来&#xff0c;我都在思考一个问题&#xff1a;CPU有没有未公开的指令&#xff1f;或者说&#x…

在Ubuntu下运行 apt-get update命令后出现错误:

在Ubuntu下运行 apt-get update命令后出现错误: The package lists or status file could not be parsed or opened sudo rm /var/lib/apt/lists/* -vf 然后&#xff1a; sudo apt-get update #&#xff08;更新软件源&#xff09;执行安装操作 sudo apt-get upgrade#&#xff…

mvc filter 的用法

1、建个类在model里面名字随便 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using RHRSP.Web.Controllers.Common;namespace RHRSP.Web.Models {public class DemoActionAttributeFilter : ActionFilterAttr…

Sandy引擎学习笔记:摄影机

第三课程&#xff1a;如何使用摄影机&#xff1f;通过摄影机移动来使摄影的对象产生变化&#xff0c;这样会使动画变得容易。因为你不需要改变观察对象的的属性&#xff0c;只是改变摄影机的变化 package { import flash.display.Sprite; import flash.events.*; impo…