《C语言文件操作》

news2024/9/29 23:28:35

目录

1. 文本数据和二进制

        1.1 文本数据

        1.2 二进制数据

        1.3文本文件和二进制文件

2. 文件的打开和关闭

        2.1 文件指针

        2.2 打开文件

        2.3 关闭文件

        2.4 注意事项:

3. 文本文件的读写

        3.1 向文件中写入数据

        3.2 从文件中读取数据

        3.3 注意事项

4. 二进制文件的读写

        4.1 向文件中写入数据

        4.2 从文件中读取数据

5.文件定位

        5.1ftell函数

        5.2rewind函数

        5.3fseek函数

6.文件缓冲区

7.标准输入、标准输出和标准错误


1. 文本数据和二进制

1.1 文本数据

        文本数据由字符串组成,存放了每个字符的 ASCII 码值,每个字符占一个字节,每个字节存放一个字符

        比如数字 123,如果用文本格式存放,数据内容是'1'、'2'、'3' 三个字符,占三个字节

 表格形式:

1.2 二进制数据

        二进制数据是字节序列,数字123的二进制表示是01111011,如果用二进制格式形式存储,char、short、int、long都可以存储123

1.3文本文件和二进制文件

  1. 按文本格式存放数据的文件称为文本文件或ASCII文件,文件可以用vi和记事本打开,看到的都是ASCII字符

  2. 按二进制格式存放数据的文件称为二进制文件,如果用 vi/vim 打开二进制文件,看到的是乱码

2. 文件的打开和关闭

        对文件进行操作之前必须先“打开”文件,操作(读和写)完成后,再“关闭”文件

2.1 文件指针

  1. 操作文件的时候,C语言为文件分配一个信息区,该信息区包含文件描述信息缓冲区位置缓冲区大小文件读写到的位置等基本信息,这些信息用一个结构体来存放(struct _IO_FILE),FILE结构体和对文件操作的库函数在 stdio.h 头文件中声明的

  2. 打开文件的时候,fopen 函数中会动态分配一个FILE结构体大小的内存空间,并把FILE结构体内存的地址作为函数的返回值,程序中用FILE结构体指针存放这个地址

  3. 关闭文件的时候,fclose 函数除了关闭文件,还会释放FILE结构体占用的内存空间

  4. FILE结构体指针习惯称为文件指针

2.2 打开文件

        C语言提供的库函数 fopen 来创建一个新的文件或者打开一个已存的文件,调用fopen函数成功后,返回一个文件指针( FILE *)

函数原型如下:

FILE fopen( const char filename, const char * mode );
  1. 参数 filename 是字符串,表示需要打开的文件名,可以包含目录名,如果不包含路径就表示程序运行的当前目录

  2. 参数 mode 也是字符串,表示打开文件的方式(模式),打开方式有很多种,我们来看一个表格

        不用去死记硬背 read简写r、write简写w、append简写a罢了

        有的说打开文本文件的方式要用"rt"、"wt"、"at"、"rt+"、"wt+"、"at+","t"是text的简写,"t"可以省略不写

        有的说打开二进制文件的方式要用"rb"、"wb"、"ab"、"rb+"、"wb+"、"ab+","b"是binary的简写

2.3 关闭文件

        fclose 库函数用于关闭文件

函数原型如下:

int fclose(FILE *fp); //fp为fopen函数返回的文件指针
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
int main() 
{ 
    FILE *fp = 0; //定义文件指针fp 
    // 以只读的方式打开文件 
    if ((fp = fopen("/root/cyy1/test83.c","r")) ==0)
    { 
        printf("文件打开失败\n"); 
        return -1; 
    } 
    fclose(fp); 
    return 0; 
}

2.4 注意事项:

1.调用 fopen 打开文件的时候,一定要判断返回值,如果文件不存在、或没有权限、或磁盘空间满了,都有可能造成打开文件失败

2.文件指针是调用 fopen 的时候,系统动态分配了内存空间,函数返回或程序退出之前,必须用 fclose 关闭文件指针,释放内存,否则后果严重

3.如果文件指针是空指针或野指针,用 fclose 关闭它相当于操作空指针或野指针,后果严重

3. 文本文件的读写

3.1 向文件中写入数据

        C语言向文件中写入数据库函数有 fputc 、fputs、fprintf。

fprintf函数的声明如下:

int fprintf(FILE *fp, const char *format, ...);

        fprintf函数的用法与printf相同,只是多了第一个参数文件指针罢了,表示把数据输出到文件

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
int main() 
{ 
    FILE *fp = 0; //定义文件指针fp 
    // 以只写的方式打开文件 
    if ( (fp=fopen("/root/cyy1/test84.txt","w")) ==0 ) 
    { 
        printf("文件打开失败\n"); 
        return -1; 
    } 
    int i = 0; 
    for (i = 0;i < 3 ;i++) 
    { 
        fprintf(fp,"这是第%d名同学\n",i+1); 
    } 
    fclose(fp); 
    return 0; 
}

        可以看到 /root/cyy1/test84.txt 中有3行记录,程序 test84.c 不管执行多少次,记录都是3行,因为文件打开的方式是 "w",每次打开文件的时候都会清空原文件中的记录

3.2 从文件中读取数据

        从文件中读取数据的库函数有 fgetc 、fgets、fscanf。

fgets函数的原型如下:

char *fgets(char *buf, int size, FILE *fp);

fgets的功能是从文件中读取一行

1.参数 buf 是一个字符串,用于保存从文件中读到的数据

2.参数 size 是打算读取内容的长度

3.参数 fp 是待读取文件的文件指针

4.如果文件中将要读取的这一行的内容的长度小于size,fgets函数就读取一行,如果这一行的内容大于等于size,fgets函数就读取size-1字节的内容

5.调用fgets函数如果成功的读取到内容,函数返回buf,如果读取错误或文件已结束,返回空,即0。如果fgets返回空,可以认为是文件结束而不是发生了错误,因为发生错误的情况极少出现

3.3 注意事项

1.在读取到 size-1 个字符之前如果出现了换行,或者读到了文件末尾,则读取结束

2.不管 size 的值多大,fgets函只读取一行数据,不能跨行

3.可以将 size 的值设置地足够大,确保每次都能读取到一行完整的数据

4. 二进制文件的读写

  1. 二进制文件没有行的概念,没有字符串的概念

  2. 我们把内存中的数据结构直接写入二进制文件,读取的时候,也是从文件中读取数据结构的大小一块数据,直接保存到数据结构中。这里所说的数据结构不只是结构体,是任意数据类型

4.1 向文件中写入数据

        fwrite函数用来向文件中写入数据块

原型为:

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)

参数:

  1. ptr -- 这是指向要被写入的元素数组的指针

  2. size -- 这是要被写入的每个元素的大小,以字节为单位

  3. nmemb -- 这是元素的个数,每个元素的大小为 size 字节

  4. stream -- 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输出流

返回值:

        如果成功,该函数返回一个 size_t 对象,表示元素的总数,该对象是一个整型数据类型。如果该数字与 nmemb 参数不同,则会显示一个错误

4.2 从文件中读取数据

        fread函数用来从文件中读取数据块

原型为:

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)

参数

1.ptr -- 这是指向带有最小尺寸 size*nmemb 字节的内存块的指针

2.size -- 这是要读取的每个元素的大小,以字节为单位

3.nmemb -- 这是元素的个数,每个元素的大小为 size 字节

4.stream -- 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输入流

返回值

        调用fread函数如果成功的读取到内容,函数返回读取到的内容的字节数,如果读取错误或文件已结束,返回空,即0。如果fread返回空,可以认为是文件结束而不是发生了错误

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
struct Student 
{ 
    char name[51]; 
    int age; 
    int height; 
}; 
int main() 
{ 
    FILE *fp = 0; //定义文件指针fp 
    struct Student stu; // 以只读的方式打开文件 
    if ( (fp=fopen("/root/cyy1/test86.txt","rb")) ==0 ) 
    { 
        printf("文件打开失败\n"); 
        return -1; 
    } 
while (1) 
{ 
    if ( (fread(&stu,sizeof(stu),1,fp)) == 0) 
    {
        break; 
    }
    printf("姓名:%s 年龄:%d 身高:%d\n",stu.name,stu.age,stu.height); 
} 
    fclose(fp); 
    return 0; 
}

5.文件定位

        1.在文件内部有一个位置指针,用来指向文件当前读写的位置。在文件打开时,如果打开方式是r和w,位置指针指向文件的第一个字节,如果打开方式是a,位置指针指向文件的尾部。每当从文件里读取n个字节或文件里写入n个字节后,位置指针也会向后移动n个字节

        2.文件位置指针与C语言中的指针不是一回事。位置指针仅仅是一个标志,表示文件读写到的位置,不是变量的地址。文件每读写一次,位置指针就会移动一次,它不需要您在程序中定义和赋值,而是由系统自动设置

        3.C语言提供了 ftell 、rewind 和 fseek 三个库函数来实现文件定位功能

 5.1ftell函数

        ftell函数用来返回当前文件位置指针的值,这个值是当前位置相对于文件开始位置的字节数

声明:

long int ftell(FILE *stream)

5.2rewind函数

        rewind函数用来将位置指针移动到文件开头

声明:

void rewind ( FILE *fp );

5.3fseek函数

        fseek函数用来将位置指针移动到任意位置

声明:

int fseek(FILE *stream, long int offset, int whence)

参数

  1. stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了流

  2. offset -- 这是相对 whence 的偏移量,以字节为单位

  3. whence -- 这是表示开始添加偏移 offset 的位置。它一般指定为下列常量之一

返回值

如果成功,则该函数返回零,否则返回非零值

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
int main() 
{ 
    FILE *fp = 0; //定义文件指针fp 
    // 以只读的方式打开文件 
    if ( (fp=fopen("/root/cyy1/book1.txt","w+")) ==0 ) 
    { 
        printf("文件打开失败\n"); 
        return -1; 
    } 
    fprintf(fp,"hello world\n"); 
    fseek(fp,6,SEEK_SET);//光标在第二行的第6个字节处,下一行代码写入从第二行第七个字节位置开始写    入 
    fprintf(fp,"xiaoqiu\n"); 
    fclose(fp); 
    return 0; 
}

        最初程序创建文件和写入 hello world,但是之后我们在第6个位置重置了写指针,并使用 fprintf 语句来重写文件,所以 book1.txt 里面的内容是 hello xiaoqiu

6.文件缓冲区

        在操作系统中,存在一个内存缓冲区,当调用fprintf、fwrite等函数往文件写入数据的时候,数据并不会立即写入磁盘文件,而是先写入缓冲区,等缓冲区的数据满了之后才写入文件。还有一种情况就是程序调用了 fclose 时也会把缓冲区的数据写入文件

        如果想把缓冲区的数据立即写入文件,可以调用 fflush 库函数

声明如下:

int fflush(FILE *fp);

        函数的参数只有一个,即文件指针,返回0成功,其它失败

7.标准输入、标准输出和标准错误

        Linux操作系统为每个程序默认打开三个文件,即标准输入stdin、标准输出stdout和标准错误

        输出stderr,其中0就是stdin,表示输入流,指从键盘输入,1代表stdout,2代表stderr

例如:

printf("Hello xiaoqiu.\n");

等同于

fprintf(stdout,"Hello xiaoqiu.\n");

感谢你的阅读,希望对你有所帮助~

欢迎批评指正,共同进步!

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

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

相关文章

如何对于单元格数据进行清洗处理

如何对于单元格数据进行清洗处理 陪伴意味着有人愿意把最美好的东西给你&#xff0c; 那就是时间。 当然陪伴也是一个很平常的事情&#xff0c; 日复一日&#xff0c;年复一年。 到最后陪伴就成了一种习惯。 约定好的相逢&#xff0c;伴你天荒地老&#xff01; 陪伴是最长情的告…

Git分支管理(Git分支的原理、创建、切换、合并、删除分支)

系列文章目录 文章一&#xff1a;Git基本操作 文章目录 系列文章目录前言一、Git分支是什么二、Git分支的原理三、创建分支四、切换分支五、合并分支六、删除分支 前言 在上一篇文章中&#xff0c;我们学习了如何使用Git的一些基本操作&#xff0c;例如安装Git、创建本地仓库…

Unity使用Addressable热更新

先看热更新的gif: Addressable是Unity推出的打ab包方案。不需要手动写AB打包脚手架了&#xff0c;不需要关心依赖&#xff0c;这也简化了ab热更新的流程。Addressable打包需要先将资源放入group中&#xff0c;按group来打包&#xff0c;每个group对应一个ScriptableObject的配置…

Unity 关节:铰链、弹簧、固定、物理材质:摩檫力、 特效:拖尾、

组件-物理-关节&#xff1a;铰链&#xff08;类似门轴&#xff09; 自动动作、多少力可以将其断开、 弹簧可以连接另一个刚体&#xff08;拖动即可&#xff09; 固定一般是等待一个断裂力&#xff0c;造成四分五裂的效果。 物理材质 设置摩檫力&#xff0c;则可以创造冰面的…

【算法面试题】-04

执行时长 def min_execution_time(n, size, tasks):a 0ans sizei 0while i < size:tmp tasks[i]a tmpif a < n:a 0else:a - ni 1ans a // nif a % n ! 0:ans 1return ans# 读取输入 n int(input()) size int(input()) tasks list(map(int, input().split()))…

macOS14.4安装FFmpeg及编译FFmpeg源码

下载二进制及源码包 二进制 使用brew安装ffmpeg : brew install ffmpeg 成功更新到ffmpeg6.1 下载FFmpeg源码

SMART PLC自适应低通滤波器(收放卷线速度滤波)

一阶低通滤波器更多内容请参考信号处理专栏相关文章,常用链接如下: 1、SMART PLC 低通滤波器和模拟量采集应用 https://rxxw-control.blog.csdn.net/article/details/136595982https://rxxw-control.blog.csdn.net/article/details/1365959822、SMART PLC双线性变换和后向差…

实拆一个Philips剃须刀

拆卸难度很大&#xff0c;怪不得防水 FR&#xff1a;徐海涛(hunkXu)

【Prometheus】DataModel

数据模型 DataModel 指标 Metric metric 包含 metric name 和 metric label 格式&#xff1a; <metric name>{<label name><label value>, ...}例如&#xff1a;服务器 HTTP 接口 /messages 的总请求数 api_http_requests_total{method"POST",…

算法第二十六天-删除有序数组中的重复项Ⅱ

删除有序数组中的重复项 题目要求 解题思路 题目要求中提到原地修改&#xff0c;那么肯定需要一个指针指向当前即将放置元素的位置&#xff0c;需要另外一个指针向后遍历所有元素&#xff0c;所以[双指针]解法呼之欲出。 慢指针slow&#xff1a;指向当前元素放置的位置&…

旅游资源网站|基于SSM 框架+vue+ Mysql+Java+B/S架构技术的旅游资源网站设计与实现(可运行源码+数据库+设计文档+部署说明+视频演示)

目录 文末获取源码 前台首页功能 管理员功能 用户功能模块 数据库设计 系统结构设计 lunwen参考 概述 源码获取 文末获取源码 前台首页功能 旅游资源网站 &#xff0c;在系统首页可以查看首页、景点信息、酒店信息、客房信息、交流论坛、红色文化、个人中心、后台管理…

【AI辅助研发】-趋势:大势已来,行业变革

【AI辅助研发】-趋势&#xff1a;大势已来&#xff0c;行业变革 引言 在科技日新月异的今天&#xff0c;人工智能&#xff08;AI&#xff09;技术已逐渐渗透到各行各业&#xff0c;其中软件研发行业更是受益匪浅。AI辅助研发已成为大势所趋&#xff0c;不仅提高了软件开发的效…

toB开发范式

前言 B端开发&#xff0c;也被称为后台开发或者企业级开发&#xff0c;是针对企业或者组织的业务需求进行的软件开发。在 B 端开发中&#xff0c;我们通常关注的是系统的功能性、稳定性、可扩展性以及安全性&#xff0c;从面向过程编程 -> 面向对象编程 组合式编程 以下是…

蓝桥杯练习系统(算法训练)ALGO-981 过河马

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 在那个过河卒逃过了马的控制以超级超级多的走法走到了终点之后&#xff0c;这匹马表示它不开心了……   于是&#xff0c…

21 卷积层里的多输入多输出通道【李沐动手学深度学习v2课程笔记】

目录 1. 多输入输出通道&相应代码实现 1.1 多输入 1.2 多输出 1.3 1x1 卷积层 1.4 小结 1. 多输入输出通道&相应代码实现 1.1 多输入 为了加深理解&#xff0c;我们实现一下多输入通道互相关运算。 简而言之&#xff0c;我们所做的就是对每个通道执行互相关操作&a…

YOLOv8原创二次改进DCNv3结构:即插即用|使用纯pytorch代码实现,不需要CUDA编译,并针对YOLOv8专门优化模块,基于可变形卷积的超强变种

💡本篇内容:YOLOv8原创改进DCNv3结构:即插即用|使用纯pytorch代码实现,不需要CUDA编译,并针对YOLOv8专门优化模块,基于可变形卷积的超强变种,优势:不需要编译! 💡附改进源代码及教程,用来改进🚀 DCNv3可变形网络结构 VisDrone有效涨点 关键词:DCNv3网络改进…

GTH手册学习注解

CPLL的动态配置 终于看到有这个复位功能了 QPLL SWITCHing需要复位 器件级RESET没发现有管脚引出来 两种复位方式&#xff0c;对应全复位和器件级复位 对应的复位功能管脚 改那个2分频的寄存器说明段&#xff0c;复位是自动发生的&#xff1f;说明可能起效了&#xff0c;但是分…

数字化转型导师坚鹏:基于湖北产业的科技金融创新模式与案例研究

基于湖北产业政策的科技金融创新模式与案例研究 课程背景&#xff1a; 很多银行存在以下问题&#xff1a; 不清楚科技金融有哪些利好政策&#xff1f; 不知道科技金融有哪些成功案例&#xff1f; 不知道科技金融有哪些创新模式&#xff1f; 课程特色&#xff1a; 有…

【linux进程信号】信号的产生

【Linux进程信号】信号的产生 目录 【Linux进程信号】信号的产生信号概念生活中的信号技术应用角度的信号注意信号概念用kill -l命令可以察看系统定义的信号列表信号处理常见方式概览 产生信号通过终端按键产生信号调用系统函数向进程发信号由软件条件产生信号由硬件异常产生信…

Pr 模版字体无法修改,始终是红色,解决办法?

1.问题如图所示&#xff1a; 2.【解决办法】&#xff1a;关闭PR&#xff0c;将PR切换为英文&#xff0c;然后重新打开PR&#xff0c;使用该模版就不会出现类似的问题。 具体操作可以参考这篇文章&#xff1a; https://blog.csdn.net/qq_42393720/article/details/128277352