C 语言文件操作
C 语言文件操作
1. 数据流:
程序与数据的交互以流的形式进行。fopen 即打开数据流,fclose 即刷新数据流。
所谓数据流,是一种抽象,表示这段数据像流一样,需要逐步接收,不能随机存取;也意味着是一段连续的内容,每块数据之间的顺序是确定的。比如一个很大的文件,不能一次性加载到内存里面,无法直接获取文件任意位置的内容,只能逐渐加载到内存。
比如 TCP 被抽象为 stream 而 UDP 被抽象为 block。
2. 缓冲区:
fopen 时, 磁盘 --> 缓冲区 ;
fread 时, 缓冲区 --> 程序 ;
fwrite 时,程序 --> 缓冲区 ;
fclose 时,缓冲区 --> 磁盘 ;
当进行文件读取时,不会直接对磁盘进行读取,而是先打开数据流,将磁盘上的文件信息拷贝到缓冲区内,然后程序再从缓冲区中读取数据;
当进行文件写入时,不会直接对磁盘进行写入,而是先写入缓冲区,只有在“缓冲区已满”或“关闭文件”时,才会将数据写入磁盘;
貌似可以设置不使用缓冲区,这种情况会使用低级 io 函数直接对磁盘进行操作,速度慢,不是标准函数,不好跨平台。
3. 文本模式和二进制模式:
fopen 时,可以指定打开文件的模式,"t" 表示文本模式,"b" 表示二进制模式;
使用文本模式打开文件的话,文件中的 \r\n (回车换行) 转为 \n,保存文件到磁盘时,\n 会转为 \r\n ;
为什么会区分文本模式、二进制模式?
计算机还没出现之前,使用打字机进行文本输入,当写完一行之后,需要进行两个操作 回车(return)、换行(next), 回车是把打印头移到行首,换行是把打印头移到下一行。后来,计算机发明了,一些人认为换行需要两个字符,太浪费,加一个就可以,这就出现了分歧。
Windows 按照打字机的形式,操作文本文件时,如果需要换行,要在字符串结尾的地方输入两个字符 \r,\n;
Linux 没这么想,需要换行的时候,在字符串结尾加一个字符 \n 就好了;
后来 ANSI 规定, C 语言中 \n 在文本模式下是“逻辑新行符”,读写时可根据平台和物理存储间进行转换。
看到 ANSI 这样的规定,Windows 考虑到要兼容以前的文本文件,在实现 C 运行时库的时候,就在文本打开和保存的时候,对原先的 \r\n 进行了转换;
而 Linux 的文本模式和二进制模式,没有区别。
mac os 的文本模式 \r 代表新行……
VS2008 有时候会出现“行尾不一致,需要将行尾标准化吗?”这样的提示,并让用户选择 Windows(CRLF),就是因为文件的行尾代码不是 \r\n 造成的,此时选择确定或取消,只是把行尾代码统一为 \r\n ,并不会出现什么问题。
何时使用文本模式操作文件?
我觉得只有在处理文本文档的时候需要使用文本模式,平时解析配置文件、生成日志文件等场景,使用二进制模式就好了。
注意:
文本文件只应该使用文本模式打开;二进制文件只应该使用二进制模式打开;否则可能出现意外错误;
如果一个 文本文件 需要在 Windows 和 Linux 等系统间交替使用,那么应该在操作文件前对 换行符 进行转换;
4. 文件指针:
大部分的读取、写入函数,都会移动文件指针的位置。
主要函数:
fseek(); // 设定文件指针位置
ftell(); // 获取当前位置
rewind(); // 调整到最开始
宏:
SEEK_SET // 开始
SEEK_CUR // 当前位置
SEEK_END // 结尾
注意:
为了保持与过去不能同时进行读写操作的兼容性,一个操作不能随后直接紧跟一个输出操作,反之亦然。如果要同时进行输入和输出操作,必须在其中插入fseek函数的调用。
当使用 r+,w+,a+ 等读写方式打开文件时,读操作和写操作之间必须有一个 fseek 来转换读写状态,否则可能出现不确定的情况:
fgets(buf, 6, pFile);
fseek(pFile, 0, 0); // 立即调用 fseek 将文件指针调整到合适的位置
fputs("sosad", pFile);
5. EOF(End of File)
EOF是一个宏,很多函数会返回这个宏来表示文件已经达到末尾或者函数执行过程中发生了错误。比如 fputs
feof(File*) 是一个函数,可以用来判断文件是否已经到达末尾;
6. C 语言文件操作函数汇总:
打开关闭: fopen,fclose,freopen(可以重新指定文件模式)
读写:fgetc,fputc, fgets,fputs, fread,fwrite, fprintf,fscanf, getc,putc, getchar,putchar, gets,puts ...
缓冲区操作:fflush, setbuf,setbuffer, setlinebuf,setvbuf ...
7. 常用函数示例:
void ReadBinaryFileToStr(const char* path, std::string& outStr)
{
FILE* pFile = fopen(path, "rb");
fseek(pFile, , SEEK_END);
long lsize = ftell(pFile);
rewind(pFile); char* pBuf = new char[lsize+];
int ret = fread(pBuf, , lsize, pFile);
if (ret == lsize)
{
pBuf[lsize] = '\0';
outStr.append(pBuf);
delete[] pBuf;
}
fclose(pFile);
} void WriteBinaryFileFromStr(const char* path, std::string& inStr)
{
FILE* pFile = fopen(path, "wb");
fwrite(inStr.c_str(), sizeof(char), inStr.length(), pFile);
fclose(pFile);
}
参考文章:
http://blog.csdn.net/xiaodan007/article/details/8350193
http://blog.csdn.net/silyvin/article/details/7275037
http://xu020408.blog.163.com/blog/static/26548920094673814288/
C 语言文件操作的更多相关文章
- go语言文件操作,这期资料比较详细( 欢迎加入go语言群: 218160862 )
go语言文件操作,这期资料比较详细 欢迎加入go语言群: go语言深圳群 golang深圳 218160862 点击加入 文件操作 func Open(name string) (file *File ...
- C语言文件操作
C语言文件操作,以下以基本的例子和说明来展开怎么通过C语言来进行文件操作. 操作文件,我们得需要知道什么?当然是路径和文件名. 首先我需要知道我操作的文件在哪里,叫什么名字.在C语言中还存在一个打开方 ...
- C语言文件操作函数
C语言文件操作函数大全 clearerr(清除文件流的错误旗标) 相关函数 feof表头文件 #include<stdio.h> 定义函数 void clearerr(FILE * str ...
- C语言文件操作解析(五)之EOF解析(转载)
C语言文件操作解析(五)之EOF解析 在C语言中,有个符号大家都应该很熟悉,那就是EOF(End of File),即文件结束符.但是很多时候对这个理解并不是很清楚,导致在写代码的时候经常出错,特 ...
- 【转】C语言文件操作解析(三)
原文网址:http://www.cnblogs.com/dolphin0520/archive/2011/10/07/2200454.html C语言文件操作解析(三) 在前面已经讨论了文件打开操作, ...
- C语言文件操作函数大全(超详细)
C语言文件操作函数大全(超详细) 作者: 字体:[增加 减小] 类型:转载 本篇文章是对C语言中的文件操作函数进行了详细的总结分析,需要的朋友参考下 fopen(打开文件)相关函数 open,fc ...
- C语言文件操作 FILE结构体
内存中的数据都是暂时的,当程序结束时,它们都将丢失.为了永久性的保存大量的数据,C语言提供了对文件的操作. 1.文件和流 C将每个文件简单地作为顺序字节流(如下图).每个文件用文件结束符结束,或者在特 ...
- C语言文件操作相关函数
在实际应用中,我们往往需要对文件进行操作,下面我将介绍C语言的一些关于操作文件的函数. 一.计算机文件 计算机文件是以计算机硬盘为载体存储在计算机上的信息集合,是存储在某种长期储存设备上的一段数据流. ...
- 关于C语言文件操作
关于C语言的文件操作之前我也写过一篇博客来介绍,但是当时写的很不全面,只是简单的使用了一下 ,今天再从新学习一下. 1.文件的写 首先还是先看一个简单的例子: include<stdio.h&g ...
随机推荐
- UITableView 应用及其总结
Plain: Grouped: Cell的结构图: UITableViewCellStyleDefault:预设使用这种,若左侧ImageView没图的话,只有一行字(textLable.text). ...
- Python2.x与3.x版本区别
Python的3.0版本,常被称为Python 3000,或简称Py3k.相对于Python的早期版本,这是一个较大的升级. 为了不带入过多的累赘,Python 3.0在设计的时候没有考虑向下相容 ...
- C#和asp.net执行外部EXE程序
这两天研究下.Net的执行外部EXE程序问题,就是在一个程序里通过按钮或其他操作运行起来另外一个程序,需要传入参数,如用户名.密码之类(实际上很类似单点登录,不过要简单的多的多):总结如下: 1.CS ...
- Upgrading to Java 8——第二章 Method References(方法引用)
概述 很多java 方法会使用函数式接口作为参数.例如,java.util.Arrays类中的一个sort方法,就接受一个Comparator接口,它就是一个函数式接口,sort方法的签名如下: pu ...
- Python 文件读和写
- HDU 5647 DZY Loves Connecting 树形dp
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5647 题解: 令dp[u][0]表示u所在的子树中所有的包含i的集合数,设u的儿子为vi,则易知dp ...
- Linux 下Valgrind 使用
Valgrind包括如下一些工具: Memcheck.这是valgrind应用最广泛的工具,一个重量级的内存检查器,能够发现开发中绝大多数内存错误使用情况,比如:使用未初始化的内存,使用已经释放了的内 ...
- 装载:对CSS中的Position、Float属性的一些深入探讨
对CSS中的Position.Float属性的一些深入探讨 对CSS中的Position.Float属性的一些深入探讨 对于Position.Float我们在平时使用上可以说是使用频率非常高的两个 ...
- IIS网站打不开错误解决方案集锦(一):编译器错误消息: 编译器失败,错误代码为 -1073741502。
[2015-05-12解决记录] 问题:服务器上的文件一直都是好的,但是运行了很长一段时间以后,发现网站打不开,或者上传不了图片了,怎么办? 错误信息:c:\windows\system32\inet ...
- 四大机器学习降维算法:PCA、LDA、LLE、Laplacian Eigenmaps
四大机器学习降维算法:PCA.LDA.LLE.Laplacian Eigenmaps 机器学习领域中所谓的降维就是指采用某种映射方法,将原高维空间中的数据点映射到低维度的空间中.降维的本质是学习一个映 ...