文件操作

似梦清欢
• 阅读 266
文件原理解析
C文件概述

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

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

文件指针

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


文件打开及关闭!

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

#include <stdio.h>

int main()
{
    FILE*fp;
    fp=fopen("file.txt","r+");
    if(NULL==fp)
    {
        perror("fopen");
        return  -1;
    }
    char c;
//    c=fgetc(fp);
//    printf("%c ",c);
//    c=fgetc(fp);
//    printf("%c ",c);
    while((c=fgetc(fp))!=EOF)
    {
        printf("%c ",c);
    }
    c=fputc('W',fp);
    if(-1==c)
    {
        perror("fputc");
        return -1;
    }
    fclose(fp);
    return  0;
}
h e l l o

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


文件读写

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

fread和fwrite

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

代码如下:

#include <stdio.h>
#include <string.h>

int main() {
    char buf[20]="Hello\nWorld";
    FILE*fp;
    int ret;
    fp=fopen("file.txt","r+");
    if(-1==fp)
    {
        perror("fopen");
        return -1;
    }
    //ret=fwrite(buf,sizeof(char),strlen(buf),fp);
    char buf1[20]={0};
    ret=fread(buf1,sizeof(char),sizeof(buf1),fp);
    printf("%s",buf1);
    fclose(fp);
    return 0;
}
Hello
World

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

fgets和fputs

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


文件位置指针偏移

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

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

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

点赞
收藏
评论区
推荐文章
CuterCorley CuterCorley
3年前
C语言入门系列之11.文件和文件操作
一、C文件概述1.基本概念文件是指一组相关数据的有序集合,这个数据集有一个名称,叫做文件名。我们在前面的已经使用到了很多文件,例如源程序文件、目标文件、可执行文件、库文件(头文件)等。文件通常是驻留在外部介质(如磁盘等)上的,在使用时才调入内存中来。操作系统是以文件为单位对数据进行管理的,示意如下:2.文件分类从不同
Wesley13 Wesley13
2年前
java SQL常用语句总结大全(超详细)
数据库数据库定义:\\数据库:\\存储数据的仓库.其本质是一个文件系统,数据库按照特定的格式将数据存储到文件中,使用者可以对数据库中的数据进行增加,修改,删除及查询操作。存储位置优点缺点内存例如:集合,实体类对象数据是放在内存中存取速度很快不能永久的保存,程序停止时,内存释放数据消失文件例如
并发编程
并发编程笔记本博客根据学习而做的笔记,链接如下一、基本概念1、进程与线程进程程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理IO的。当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程。进程
Stella981 Stella981
2年前
Python 操作 excel
一、概述操作excel是程序员经常要遇到的场景。因为产品、运营的数据都是以这种格式存储。所以,当程序员拿到这些数据肯定要解析,甚至需要把结果输出成excel文件。下面就介绍如果用Python方面的读、写excel文件。二、openpyxlAPythonlibrarytoread/wr
Wesley13 Wesley13
2年前
mysql高效导入导出load data [infile][outfile]用法
一、MySQL高效导入数据的方法loaddatainfileloaddatainfile语句从一个文本文件中以很高的速度读入一个表中。使用这个命令之前,mysqld进程(服务)必须已经在运行。由于安全原因,当读取位于服务器上的文件时,文件必须处于数据库目录或可被所有人读取。另外,为了对服务器上文件使用loaddatainfile,在服
Stella981 Stella981
2年前
Skynet 进程启动
Skynet进程启动初始化配置skynet进程启动时需要指定配置文件,启动后读取配置文件中的内容并存储在内存中。配置文件格式是kv且k必须是字符串而v必须是字符串或者luaboolean类型。通过L读取配置,随后把配置存储在skynet_env.c模块中
Stella981 Stella981
2年前
Class类文件结构
1、概述  Class文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑的排列在Class文件中,中间没有添加任何的分隔符,这使得整个Class文件中存储的内容几乎全部是程序运行的必要数据。当遇到需要占用8个字节以上空间的数据项时,则会按照高位在前的方式分隔成多个8位字节进行存储。  Class文件采用一种类似于C语言结构
Stella981 Stella981
2年前
Redis学习笔记(五)之持久化
RDB在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存中。Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了。再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是
Stella981 Stella981
2年前
NSUserDefaults轻量级本地存储数据
NSUserDefaults适合存储轻量级的本地数据,比如要保存一个登陆界面的数据,用户名、密码之类的,个人觉得使用NSUserDefaults是首选。下次再登陆的时候就可以直接从NSUserDefaults里面读取上次登陆的信息咯。因为如果使用自己建立的plist文件什么的,还得自己显示创建文件,读取文件,很麻烦,而是用NSUserDefaults则不
3A网络 3A网络
1年前
教你如何将二进制文件导入到数据库
教你如何将二进制文件导入到数据库1.1现网业务场景源数据推送二进制流解析二进制解析后的数据导入数据库为了模拟生产的业务场景,客户提供了一个二进制文件及二进制文件的解析程序,需要我们解析二进制文件后导入数据库。1.2测试方案由于客户给出的解析程序是单条解析,为了提升数据导入的性能,需要微批导入的方式,在内存中积攒一定量的数据后,再调用copy
似梦清欢
似梦清欢
Lv1
慢慢来吧...
文章
17
粉丝
12
获赞
17