C语言文件读取那些事(open,fopen等函数深层理解)

2023-06-29 17:28:26 浏览数 (1)

C语言文件读取操作特别是在linux内核,嵌入式开发中使用的较为频繁。

文件读取示例

代码语言:javascript复制
	文件读取操作
	char buf[100] = {0};
	fd = open("xxx.c");
	
	// fd接受返回值,-1为错误
	char writebuf[20] = "I love";
	// 读取文件到buf数组中,长度为10个
	ret = read(fd, buf, 10);
	
	// 写入数据
	ret = write(fd, writebuf, strlen(writebuf));
	
	close(fd);  

C语言中,文件操作为:打开(open),操作(write),关闭(close)

区别于python等语言,缺少关闭操作,但同时有保存操作。

为什么需要关闭函数

文件操作是在电脑内存中进行(区别于外存--硬盘),文件在内存中操作后还需要保存在外存上。所以每次写文档时需要注意:要时刻保存文档(Ctrl s),因为文件内容当前在内存中,没有外存在外存中。(为什么电脑不能写一个数据就自动保存呢?主要原因还是频繁的写入数据到外存中将加快硬盘的损坏。)

关闭函数其实就是告诉电脑,在内存中的内容已经写好,需要保存到硬盘上了。

打开函数

代码语言:javascript复制
	open("xxx",O_TRUNC)		//文件中原有内容清空
	open("xxx",O_APPEND)	//写到内容的后面
	open("xxx",O_CREAT)	//创建一个不存在的文件并打开(如果以前存在,则会删除老文件在创建同名文件)
	open("xxx",O_CREAT | O_EXCL, 0666)	//不存在文件进行创建,存在文件时进行报错(0666目的是使文件可读可写)
	
其中:
	O_NONBLOCK	//非阻塞模式,打开文件如果不能立马执行,则立刻退回(默认是阻塞模式,文件一定被打开但时间没保证)
					// 应用于硬件打开(设备文件),不用于普通文件
					
	O_SYNC		//没有O_SYNC时,write写入的内容只是在底层的缓冲区(之后一起存放在硬件中),有些时候文件非常重要需要直接写入硬件中

lseek函数,确定当前所属文件位置

代码语言:javascript复制
	#include <stdio.h>
	#include <sys/types.h>
	#include <sys/stat.h>
	#include <fcntl.h>
	#include <unistd.h>
	#include <string.h>

	int cal_len(const char *pathname)
	{
	int fd = -1;		// fd 就是file descriptor,文件描述符
	int ret = -1;
	
	// 第一步:打开文件
	#if 1
	fd = open(pathname, O_RDONLY);
	if (-1 == fd)		// 有时候也写成: (fd < 0)
	{
		//printf("n");
		perror("文件打开错误");
		// return -1;
		return -1;
	}
	#endif
	
	
	// 此时文件指针指向文件开头
	// 我们用lseek将文件指针移动到末尾,然后返回值就是文件指针距离文件开头的偏移量,也就是文件的长度了
	ret = lseek(fd, 0, SEEK_END);
	
	return ret;
	}



	int main(int argc, char *argv[])
	{
	int fd = -1;		// fd 就是file descriptor,文件描述符
	int ret = -1;
	
	if (argc != 2)
	{
		printf("usage: %s filenamen", argv[0]);
		_exit(-1);
	}
	

	printf("文件长度是:%d字节n", cal_len(argv[1]));
	
	return 0;
	}

其中,#if 1 ...... #endif代表运行....中的内容,数字改为0时表示不运行

多进程打开文件

open函数其实是有返回值的,返回值一般为(0,1,2,3...)。其中,0,1,2被系统默认使用(分别应用于标准输入,输出,错误---当程序报错时,就是在标准输出中返回内容)

代码语言:javascript复制
fd = open('xxx');  //fd就是open函数的返回值,一般从3开始

当多个open函数打开同一个文档时,不同open对应一个返回值---虽然打开的是同一个文档。

0 人点赞