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, 0, SEEK_END);
    long lsize = ftell(pFile);
    rewind(pFile);

    char* pBuf = new char[lsize+1];
    int ret = fread(pBuf, 1, 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 语言文件操作,布布扣,bubuko.com

时间: 2024-08-01 10:42:05

C 语言文件操作的相关文章

C语言文件操作函数的编写

 编写文件操作的头文件 /************************************************************************** Copyright(C)    :2014-08-5 toto Filename       :file.h Author          :涂作权 Version         :V1.1 Date            :2014-08-05 Description     :文件操作的头文件 Others  

c语言文件操作函数

c语言文件操作函数大全 fopen(打开文件) 相关函数 open,fclose 表头文件 #include<stdio.h> 定义函数 FILE * fopen(const char * path,const char * mode); 函数说明 参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态. mode有下列几种形态字符串: r 打开只读文件,该文件必须存在. r+ 打开可读写的文件,该文件必须存在. w 打开只写文件,若文件存在则文件长度清为0,即该文件

go语言文件操作,这期资料比较详细( 欢迎加入go语言群: 218160862 )

go语言文件操作,这期资料比较详细 欢迎加入go语言群: go语言深圳群 golang深圳 218160862 文件操作 func Open(name string) (file *File, err error),*File 是实现了 io.Reader这个接口byte[] 转化为 bytes.Buffer:bytes.NewBuffer([]byte). 一.建立与打开 建立文件函数:func Create(name string) (file *File, err Error)func N

C语言文件操作(一)

实例1:读写字符文件,每次读取一个字符. #include<stdio.h> #include <stdlib.h> int main() { FILE *fpin ; FILE *fpout; char c; fpout=fopen("c:\\dest.txt","wt"); if((fpin=fopen("c:\\test.txt","rt"))!=NULL) { c = fgetc(fpin);

C语言文件操作(二)

实例2:读取字符文件,每次读入一个缓存里面. #include<stdio.h> #include <stdlib.h> #define MAXLEN 1024 int main() { FILE *fin; FILE *fout=fopen("c:\\dest.txt","wt"); char buf[MAXLEN]; if((fin=fopen("c:\\test.txt","rt"))!=NULL

C语言文件操作(三)

实例3:读写字节文件,每次读入一个缓存里面. #include<stdio.h> #include <stdlib.h> #define MAXLEN 1024 int main() { FILE *fpin ; FILE *fpout; unsigned char buf[MAXLEN]; int c; fpout=fopen("c:\\dest.jpg","wb"); if((fpin=fopen("c:\\test.jpg&q

C语言文件操作(四)

实例四:随机读写.在C:\\TEST.TXT 文件中创建如下字符串:我爱你,中国 使用随机读写,输出"中国"两个字,以为中文字符占两个字节,所以要从文件首部向后偏移7个字节,逗号是英文字符,占用一个字节. #include<stdio.h> #include <stdlib.h> int main() { FILE *fp ; char c; if((fp=fopen("c:\\test.txt","rb"))!=NULL

C语言文件操作函数大全(超详细)

C语言文件操作函数大全(超详细) 作者: 字体:[增加 减小] 类型:转载 本篇文章是对C语言中的文件操作函数进行了详细的总结分析,需要的朋友参考下 fopen(打开文件)相关函数 open,fclose表头文件 #include<stdio.h>定义函数 FILE * fopen(const char * path,const char * mode);函数说明 参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态.mode有下列几种形态字符串:r 打开只读文件,

C语言 文件操作API介绍

文件的基本概念 所谓“文件”是指一组相关数据的有序集合. 这个数据集有一个名称,叫做文件名. 实际上在前面的各章中我们已经多次使用了文件,例如源程序文件.目标文件.可执行文件.库文件 (头文件)等.文件通常是驻留在外部介质(如磁盘等)上的, 在使用时才调入内存中来.从不同的角度可对文件作不同的分类.从用户的角度看,文件可分为普通文件和设备文件两种. 普通文件是指驻留在磁盘或其它外部介质上的一个有序数据集,可以是源文件.目标文件.可执行程序:也可以是一组待输入处理的原始数据,或者是一组输出的结果.