Linux文件编程(标准C库)

目录

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

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

三、其他函数补充

1.fputc函数

2.feof函数和fgetc函数


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

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

打开文件函数:

cpp 复制代码
#include <stdio.h>

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

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

写入文件函数:

cpp 复制代码
#include <stdio.h>

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

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

读取文件函数:

cpp 复制代码
#include <stdio.h>

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

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

光标移动函数:

cpp 复制代码
#include <stdio.h>

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

代码示例:

cpp 复制代码
#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库写入结构体到文件

代码示例:

cpp 复制代码
#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函数

cpp 复制代码
#include <stdio.h>

int fputc(int c, FILE *stream);

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

cpp 复制代码
#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函数:

cpp 复制代码
#include <stdio.h>

int feof(FILE *stream);

fgetc函数:

cpp 复制代码
#include <stdio.h>

int fgetc(FILE *stream);

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

cpp 复制代码
#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进程编程的学习笔记,希望大伙一起讨论学习!

相关推荐
小成202303202652 小时前
Linux高级02
linux·开发语言
mounter6252 小时前
【硬核前沿】CXL 深度解析:重塑数据中心架构的“高速公路”,Linux 内核如何应对挑战?-- CXL 协议详解与 LSF/MM 最新动态
linux·服务器·网络·架构·kernel
钢琴上的汽车软件2 小时前
C 语言中const与指针:三种常见写法辨析
c语言·指针和const
++==2 小时前
Linux 进程间通信与线程同步技术详解:IPC 机制、线程 API、同步工具与经典同步问题
linux
ZK_H3 小时前
嵌入式c语言——关键字其6
c语言·开发语言·计算机网络·面试·职场和发展
特长腿特长3 小时前
centos、ubantu系列机的用户和用户组的结构是什么?具体怎么配置?用户组权限怎么使用?这篇文章持续更新,帮助你复习linux的基础知识
linux·运维·centos
zzzyyy5383 小时前
Linux环境变量
linux·运维·服务器
ambition202423 小时前
从暴力搜索到理论最优:一道任务调度问题的完整算法演进历程
c语言·数据结构·c++·算法·贪心算法·深度优先
pluvium273 小时前
记对 xonsh shell 的使用, 脚本编写, 迁移及调优
linux·python·shell·xonsh
cmpxr_3 小时前
【C】原码和补码以及环形坐标取模算法
c语言·开发语言·算法