Linux文件编程(标准C库)

news2024/9/20 8:53:34

目录

一、标准C库打开/创建文件,读写文件,光标移动

二、标准C库写入结构体到文件

三、其他函数补充

1.fputc函数

2.feof函数和fgetc函数


前面讲到的open函数都是基于linux内核的,也就是说在Windows系统上无法运行,移植性比较差,但标准C库同样有一套对文件进行操作的函数。

一、标准C库打开/创建文件,读写文件,光标移动

打开文件函数:

#include <stdio.h>

FILE *fopen(const char *path, const char *mode);

返回值为FILE类型的文件流,第一个参数是文件的路径,第二个参数是用什么权限打开文件,权限如下:
 

写入文件函数:

#include <stdio.h>

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

第一个参数是缓存区,第二个参数表示我们要写入的每个数据的大小(例如要写入一个字符串,那么size=sizeof(char),表示一个字符的大小),第三个参数是个数,第四个选择哪个文件,传入fopen函数的返回值即可

读取文件函数:

#include <stdio.h>

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

参数含义和写入文件的函数类似 

光标移动函数:

#include <stdio.h>

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

代码示例: 

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

int main()
{
	FILE *fp;//存储fopen的返回值
	char *str = "Hello World!";
	char readBuf[128]={0};//存放读取到的数据

	fp = fopen("./li.txt","w+");//因为第二个参数要传入指针,所以用双引号

	fwrite(str,sizeof(char),strlen(str),fp);
	
	fseek(fp,0,SEEK_SET);//光标复位

	fread(readBuf,sizeof(char),strlen(str),fp);
	
	printf("read data:%s\n",readBuf);

	return 0;
}

可以看到标准C库的文件相关函数和Linux的函数是差不多的,标准C库对不同文件的操作是获取它的FILE类型的指针,而Linux是int类型的文件描述符,这些函数都可以类比Linux的函数来记忆。

运行结果: 


二、标准C库写入结构体到文件

代码示例:

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

struct Test{
	int a;
	char c;
};

int main()
{
	FILE *fp;
	
	struct Test data={100,'a'};
	struct Test data2;

	fp = fopen("./file1","w+");

	int n_write = fwrite(&data,sizeof(struct Test),1,fp);	
	fseek(fp,0,SEEK_SET);
	int n_read = fread(&data2,sizeof(struct Test),1,fp);

	printf("read %d,%c\n",data2.a,data2.c);
	fclose(fp);

	return 0;
}

这里的代码都可以类比我的上一篇文章Linux文件编程应用,只不过函数的参数和返回值不太相同,能看懂上一篇文章,那么这一篇就只是对C语言的巩固,这里解释一下fwrite函数和fread函数第二个和第三个参数的含义:拿上面代码举例,每次写都写入一个结构体类型的数据大小,用sizeof计算,第三个参数表示写了几次,这里写一次就行了。
运行结果:


三、其他函数补充

1.fputc函数

#include <stdio.h>

int fputc(int c, FILE *stream);

fputc函数可以写入一个字符或整数到文件里,用fopen函数得到文件的返回值传入fputc的第二个参数即可,要写入多个数据用循环的方式写入即可。 
代码示例:

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

int main()
{
    FILE *fp;
    char *str="Hello World!";
    int i;
    int len=strlen(str);

    fp=fopen("./file1","w+");
    for(i=0;i<len;i++)
    {
        fputc(*str,fp);
        str++;
    }
    fclose(fp);
    return 0;
}

2.feof函数和fgetc函数

feof函数:

#include <stdio.h>

int feof(FILE *stream);

fgetc函数:

#include <stdio.h>

int fgetc(FILE *stream);

这两个函数可以组合在一起用,见代码示例:

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

int main()
{
	FILE *fp;	
	char c;

	fp = fopen("./li.txt","r");

	while(!feof(fp))// nonezero if reach end of file
	{
		c = fgetc(fp);
		printf("%c",c);
	}
	fclose(fp);

	return 0;
}

我们先用只读的方式打开li.txt文件,feof可以作为条件判断,当读到文件的尾部时,feof函数的返回值为0,在while循环里使用fgetc函数一个一个字符读取fp所指向的文件。(至于为什么不会一直读文件的同一个位置,应该就和这两个函数有关)

以上就是Linux引入标准C库对文件操作的函数,看了前面两个文章,再看这篇会很好理解,用标准C库来写代码无非就是移植性比较好,以后在Linux学习过程中,很多时候还是要用到Linux的函数。接下来我会更新Linux进程编程的学习笔记,希望大伙一起讨论学习!

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

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

相关文章

shein测试开发会问些啥?

&#x1f3c6;本文收录于《CSDN问答解惑-》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&…

【thingsbord源码编译】 显示node内存不足

编译thingsbord显示报错 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory问题原因分析 重新安装java版本 编译通过

论文阅读【时空+大模型】ST-LLM(MDM2024)

论文阅读【时空大模型】ST-LLM&#xff08;MDM2024&#xff09; 论文链接&#xff1a;Spatial-Temporal Large Language Model for Traffic Prediction 代码仓库&#xff1a;https://github.com/ChenxiLiu-HNU/ST-LLM 发表于MDM2024&#xff08;Mobile Data Management&#xf…

无人机之遥控器保养

一、使用存放 1、避免让遥控器受到强烈的震动或从高处跌落&#xff0c;以免影响内部结构的精度&#xff1b; 2、遥控器在使用完后&#xff0c;需要将天线收拢&#xff0c;避免折断&#xff0c;养成定期检查天线的习惯&#xff1b; 3、定期检查遥控器按键有无裂纹、畸变、松旷…

跨境电商API的全球视野:打破地域限制,连接全球消费者与商家

在全球化日益加深的今天&#xff0c;跨境电商已成为推动全球经济一体化的重要力量。它不仅为消费者提供了前所未有的购物体验&#xff0c;让世界各地的商品触手可及&#xff0c;更为商家开辟了全新的市场蓝海&#xff0c;实现了业务的全球化拓展。在这一进程中&#xff0c;跨境…

PyTorch | 加速模型训练的妙招

引言 提升机器学习模型的训练速度是每位机器学习工程师的共同追求。训练速度的提升意味着实验周期的缩短&#xff0c;进而加速产品的迭代过程。同时&#xff0c;这也表示在进行单一模型训练时&#xff0c;所需的资源将会减少。简而言之&#xff0c;我们追求的是效率。 熟悉 PyT…

Rust代码优化的九大技巧

一.使用 Cargo 内置的性能分析工具 描述&#xff1a;Cargo 是 Rust 的包管理器&#xff0c;带有内置工具来分析代码性能&#xff0c;以识别性能瓶颈。 解释&#xff1a; 发布模式&#xff1a;在发布模式下编译启用优化&#xff0c;可以显著提高性能。 cargo build --release基…

解决vue多层弹框时存在遮挡问题

本文给大家介绍vue多层弹框时存在遮挡问题&#xff0c;解决思路首先想到的是找到对应的遮挡层的css标签&#xff0c;然后修改z-index值&#xff0c;但是本思路只能解决首次问题&#xff0c;再次打开还会存在相同的问题&#xff0c;故该思路错误&#xff0c;下面给大家带来一种正…

【鸿蒙学习笔记】文件管理

官方文档&#xff1a;Core File Kit简介 目录标题 文件分类什么是应用沙箱&#xff1f; 文件分类 应用文件&#xff0c;比如应用的安装包&#xff0c;自己的资源文件等。用户文件&#xff0c;比如用户自己的照片&#xff0c;录制的音视频等。 什么是应用沙箱&#xff1f; 应…

完美解决:MySQL8报错:Public Key Retrieval is not allowed

在配置数据源的时候直接将属性allowPublicKeyRetrieval设置为true即可 &AutoReconnecttrue

论文发表作图必备:训练结果对比,多结果绘在一个图片【Precision】【Recall】【mAP0.5】【mAP0.5-0.95】【loss】

前言:Hello大家好,我是小哥谈。YOLO(You Only Look Once)算法是一种目标检测算法,它可以在图像中实时地检测和定位目标物体。YOLO算法通过将图像划分为多个网格,并在每个网格中检测目标物体,从而实现快速的目标检测。本文所介绍的作图教程适用于所有YOLO系列版本算法,接…

Linux Ubuntu MySQL环境安装

1. 更新软件源 首先&#xff0c;确保你的Ubuntu系统已经更新了软件源列表&#xff0c;以便能够下载到最新的软件包。打开终端并输入以下命令&#xff1a; sudo apt update 2. 安装MySQL服务器 打开终端并输入以下命令来安装MySQL服务器 sudo apt install mysql-server 在…

代码随想录算法训练营第五十天| 739. 每日温度、496.下一个更大元素 I、503.下一个更大元素II

739. 每日温度 题目链接&#xff1a; 739. 每日温度 文档讲解&#xff1a;代码随想录 状态&#xff1a;不会 思路&#xff1a; 这道题需要找到下一个更大元素。 使用栈来存储未找到更高温度的下标&#xff0c;那么栈中的下标对应的温度从栈底到栈顶是递减的。这意味着&#xff…

鸿蒙语言基础类库:【@ohos.application.testRunner (TestRunner)】 测试

TestRunner TestRunner模块提供了框架测试的能力。包括准备单元测试环境、运行测试用例。 如果您想实现自己的单元测试框架&#xff0c;您必须继承这个类并覆盖它的所有方法。 说明&#xff1a; 开发前请熟悉鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harmony-…

5款常用的漏洞扫描工具,网安人员不能错过!

漏洞扫描是指基于漏洞数据库&#xff0c;通过扫描等手段对指定的远程或者本地计算机系统的安全脆弱性进行检测&#xff0c;发现可利用漏洞的一种安全检测的行为。 在漏洞扫描过程中&#xff0c;我们经常会借助一些漏扫工具&#xff0c;市面上漏扫工具众多&#xff0c;其中有一…

windows环境下基于3DSlicer 源代码编译搭建工程开发环境详细操作过程和中间关键错误解决方法说明

说明: 该文档适用于  首次/重新 搭建3D-Slicer工程环境  Clean up(非增量) 编译生成 1. 3D-slicer 软件介绍 (1)3D Slicer为处理MRI\CT等图像数据软件,可以实行基于MRI图像数据的目标分割、标记测量、坐标变换及三维重建等功能,其源于3D slicer 4.13.0-2022-01-19开…

新火种AI|微软和苹果放弃OpenAI董事会观察员席位

作者&#xff1a;一号 编辑&#xff1a;美美 微软苹果双双不做OpenAI“观察员”&#xff0c;OpenAI能更自由吗&#xff1f; 7月10消息&#xff0c;微软当地时间周一宣布将放弃在OpenAI董事会的观察员席位&#xff0c;他们称&#xff0c;OpenAI在过去八个月中取得了“重大进展…

Java(十八)---单链表

文章目录 前言1.链表的概念及结构2.单链表的创建3.功能的实现3.1.创建链表(create)(需要自己创建)3.2.显示链表(display)3.3.获取链表的个数( size() )3.4.是否包含指定元素(contains)3.5.头插法(addFirst)3.6.尾插法(addLast)3.7.在指定位置进行插入(addIndex)3.8.删除出现在第…

基于Spring Boot的高校后勤餐饮管理系统

1 项目介绍 1.1 研究背景 “互联网”时代的到来&#xff0c;既给高校后勤管理发展带来了机遇&#xff0c;也带来了更大的挑战。信息化应用已经开始普及&#xff0c;传统的高校后勤餐饮管理模式往往存在着效率低下、信息不透明、资源浪费等问题&#xff0c;已经难以满足现代高…

CSS 【实用教程】(2024最新版)

CSS 简介 CSS 是层叠样式表( Cascading Style Sheets ) 的简写&#xff0c;用于精确控制 HTML 页面的样式&#xff0c;以便更好地展示图文信息或产生炫酷/友好的交互体验。 没有必要让所有浏览器都显示得一模一样的&#xff0c;好的浏览器有更好的显示&#xff0c;糟糕的浏览器…