文件操作

文件原理解析
C文件概述

程序执行时称为进程,进程运行过程中的数据均在内存中。 需要存储运算后的数据时,需要使用文件。这样程序下次启动后,就可以直接从文件中读取数据。(之前的程序每次运行都需要手动输入数据)。 文件是指存储在外部介质(如磁盘、磁带)上的数据集合。操作系统( Windows、Linux、Mac 等)是以文件为单位对数据进行管理的。 image 实际上输入缓冲区和输出缓冲区是同一个区域。 缓冲文件系统:系统自动地在内存区为每个正在使用的文件开辟一个缓冲区。用缓冲文件系统进行的输入/输出称为高级磁盘输入/输出。 非缓冲文件系统:系统不自动开辟确定大小的缓冲区,而由程序为每个文件设定缓冲区。用非缓冲文件系统进行的输入/输出称为低级输入/输出。 缓冲区原理: 缓冲区是一段内存空间,分为读缓冲、写缓冲。

::: tip c语言缓冲的三种特性: (1)全缓冲:在这种情况下,当填满标准I/O缓存后才进行实际I/O操作。全缓冲的典型代表是对磁盘文件的读写操作。 (2)行缓冲:在这种情况下,当在输入和输出中遇到换行符时,将执行真正的I/O操作。这时,我们输入的字符先存放到缓冲区中,等按下回车键换行时才进行实际的I/O操作 典型代表是标准输入缓冲区 (stdin)和标准输出缓冲区(stdout)。 (3)不带缓冲:也就是不进行缓冲,标准出错情况(stderr)是典型代表,这使得出错信息可以直接尽快地显示出来。 :::

文件指针

每打开一个文件时,都会得到一个FILE*类型的文件指针fp,通过该文件指针对文件进行操作。 FILE是一个结构体类型,如下: image ::: warning 每读取一个字符后,ptr会自动指向下一个字符。 :::


文件打开及关闭!

fopen函数用于打开由fname(文件名)指定的文件,并返回一个关联该文件的流(即fp指针)。如果发生错误,那么fopen返回NULL。mode(方式)用于决定文件的用途(如输入、输出等)。 image 常用mode参数: image image fclose函数用于关闭给出的文件流,并释放已关联到流的所有缓冲区。fclose执行成功时返回0,否则返回EOF(-1)。 image fputc函数用于将字符ch的值输出到fp指向的文件中,如果输出成功,那么返回输出的字符;如果输出失败,那么返回EOF。 image fgetc函数用于从指定的文件中读入一个字符,该文件必须是以读或读写方式打开的。如果读取一个字符成功,那么赋给ch。如果遇到文件结束符,那么返回文件结束标志EOF。 fgetc每读到一个字符,都会自动指向下一个。 fgetc函数用于从指定的文件中读入一个字符,该文件必须是以读或读写方式打开的。如果读取一个字符成功,那么赋给ch。如果遇到文件结束符,那么返回文件结束标志EOF。 fgetc每读到一个字符,都会自动指向下一个。 image 代码如下:

1#include <stdio.h> 2 3int main() 4{ 5 FILE*fp; 6 fp=fopen("file.txt","r+"); 7 if(NULL==fp) 8 { 9 perror("fopen"); 10 return -1; 11 } 12 char c; 13// c=fgetc(fp); 14// printf("%c ",c); 15// c=fgetc(fp); 16// printf("%c ",c); 17 while((c=fgetc(fp))!=EOF) 18 { 19 printf("%c ",c); 20 } 21 c=fputc('W',fp); 22 if(-1==c) 23 { 24 perror("fputc"); 25 return -1; 26 } 27 fclose(fp); 28 return 0; 29}
h e l l o

::: warning 上述代码中同时读写的操作是在Clion实现的,VS中实现同时读写还需要其他操作。 :::


文件读写

fgetc和fputc每次只能读写一个字符。

fread和fwrite

image 其中buffer是一个指针,对fread来说它是读入数据的存放地址,对fwrite来说它是输出数据的地址(均指起始地址);size是要读写的单个成员的字节数;count是要进行读写多少size字节的数据项;fp是文件型指针。 fread函数不知道存储读取内容的大小,只能传递要存储读取内容的空间大小,即count。 fwrite函数传递写入数据的实际大小,即num。 fread函数的返回值是读取的内容数量,fwrite函数写成功后的返回值是已写对象的数量。 ::: warning fwrite写入后光标移动到最后,再fread读取时读不到内容,所以不能同时使用。 :::

代码如下:

1#include <stdio.h> 2#include <string.h> 3 4int main() { 5 char buf[20]="Hello\nWorld"; 6 FILE*fp; 7 int ret; 8 fp=fopen("file.txt","r+"); 9 if(-1==fp) 10 { 11 perror("fopen"); 12 return -1; 13 } 14 //ret=fwrite(buf,sizeof(char),strlen(buf),fp); 15 char buf1[20]={0}; 16 ret=fread(buf1,sizeof(char),sizeof(buf1),fp); 17 printf("%s",buf1); 18 fclose(fp); 19 return 0; 20}
1Hello 2World

在文本方式下,向文本文件中写入“\n”时实际存入磁盘的是“\r\n”,共12字节所有的接口调用都是Windows的系统调用,这是Windows的底层实现所决定的 (Mac和Linux不会)。 ::: tip 以文本方式写入,一定要以文本方式读出,遇到“\r\n”时底层接口会自动转换为“\n”,因此用 fread函数再次读取数据时,得到的依然是“hello\nworld”,共11字节。 ::: image 如果把上述代码fopen函数中的“r+”改为“rb+”,即改为二进制方式,向磁盘写入11字节时,磁盘实际存储的就是11字节,打开该文件会发现没有换行,即helloworld是连在一起的,中间没有换行符,原因是txt文本编辑器必须遇到“\r\n”时才进行换行操作。 image 以文本方式写入的内容要以文本方式读取,以二进制方式写入的内容要以二进制方式读取。

fgets和fputs

fgets在到达行末时停止,fgets成功时返回str(字符串) ,失败时返回NULL,读到文件结尾时返回NULL。 image fputs函数把str(字符串)指向的字符写到给出的输出流。成功时返回非负值,失败时返回EOF。 image fgets一次读取一行,包括行尾的换行符。


文件位置指针偏移

fseek函数可以改变文件的位置指针。 image *stream:文件类型指针。即FILE结构体中的ptr指针。 offset:位移量。 origin:起始点。 起始点: image

位移量是以起始点为基点向前移动的字节数,一般要求为long型。 fseek函数调用成功时返回0,调用失败时返回非0。

ftell函数返回stream当前的文件位置(位置指针距离文件开头的位置),发生错误时返回-1。 image

点赞
收藏

评论区

加载中...

相关推荐

java SQL常用语句总结大全(超详细)

数据库数据库定义:\\数据库:\\存储数据的仓库.其本质是一个文件系统,数据库按照特定的格式将数据存储到文件中,使用者可以对数据库中的数据进行增加,修改,删除及查询操作。存储位置优点缺点内存例如:集合,实体类对象数据是放在内存中存取速度很快不能永久的保存,程序停止时,内存释放数据消失文件例如

并发编程

并发编程笔记本博客根据学习而做的笔记,链接如下一、基本概念1、进程与线程进程程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理IO的。当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程。进程

C语言入门系列之11.文件和文件操作

一、C文件概述1.基本概念文件是指一组相关数据的有序集合,这个数据集有一个名称,叫做文件名。我们在前面的已经使用到了很多文件,例如源程序文件、目标文件、可执行文件、库文件(头文件)等。文件通常是驻留在外部介质(如磁盘等)上的,在使用时才调入内存中来。操作系统是以文件为单位对数据进行管理的,示意如下:2.文件分类从不同

Python 操作 excel

一、概述操作excel是程序员经常要遇到的场景。因为产品、运营的数据都是以这种格式存储。所以,当程序员拿到这些数据肯定要解析,甚至需要把结果输出成excel文件。下面就介绍如果用Python方面的读、写excel文件。二、openpyxlAPythonlibrarytoread/wr

mysql高效导入导出load data [infile][outfile]用法

一、MySQL高效导入数据的方法loaddatainfileloaddatainfile语句从一个文本文件中以很高的速度读入一个表中。使用这个命令之前,mysqld进程(服务)必须已经在运行。由于安全原因,当读取位于服务器上的文件时,文件必须处于数据库目录或可被所有人读取。另外,为了对服务器上文件使用loaddatainfile,在服

Skynet 进程启动

Skynet进程启动初始化配置skynet进程启动时需要指定配置文件,启动后读取配置文件中的内容并存储在内存中。配置文件格式是kv且k必须是字符串而v必须是字符串或者luaboolean类型。通过L读取配置,随后把配置存储在skynet_env.c模块中