前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C语言文件读取那些事(open,fopen等函数深层理解)

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

原创
作者头像
用户8282247
修改2023-06-29 17:28:26
8380
修改2023-06-29 17:28:26
举报
文章被收录于专栏:用户8282247的专栏

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 filename\n", 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对应一个返回值---虽然打开的是同一个文档。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文件读取示例
    • 为什么需要关闭函数
      • 打开函数
        • lseek函数,确定当前所属文件位置
        • 多进程打开文件
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档