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