2021-06-23嵌入式学习杂记---Linux文件编程

1、文件打开/创建编程

#include <sys/types.h>//需要包含的头文件
#include <sys/stat.h>
#include <fcntl.h>
//编程格式
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
Pathname: 
要打开的文件名(含路径,缺省为当前路径)
Flags:
  O_RDONLY只读打开 O_WRONLY只写打开 O_RDWR可读可写
 当我们附带了权限后,打开的文件就只能按照这种权限来操作。
 以上这三个常数应当只指定一个。下列常数是可选择的:
 O_CREAT若文件不存在则创建它,使用此选项,需要同时说明第三个参数mode,用其说明新文件的权限。
 O_EXCL 如果同时制定了O_CREAT,而文件已经存在,则出错
 O_APPEND 每次写时都加到文件的尾端,追加的功能,不覆盖原来已有的内容
 O_TRUNC属性去打开文件时,如果这个文件中本来是有内容的,而且为制度或只写成功打开,则将其长度截短为0,把原来内存删除,重新写入
Mode:
一定是在flags中使用了O_CREAT标志,mode记录待创建的文件的权限。0600可读可写
int creat(const char *pathname, mode_t mode);//创建文件
mode:创建模式
S_IRUSR   可读
S_IWUSR   可写
S_IXUSR   可执行
S_IRWXU   可读可写可执行
open() creat()返回值
是一个文件描述符,是一个小的非负整数,用于后续的系统调用。

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>

int main()
{
	int fd;//open()返回值
	fd = open("./demo1", O_RDWR);//打开文件。如果文件已经存在,fd返回值=3,否则fd=-1
   //fd = open("./demo1", O_RDWR|O_CREAT,0600);//文件不存在就新创建一个文件,并给予权限0600可读可写
	printf("fd = %d\n", fd);
	return 0;
}

2、文件写入编程

#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
//write()将从buf开始的缓冲区中的count个字节写入该文件所引用的文件描述符fd。
fd:
文件打开/创建成功后的返回值
buf 无类型指针
缓冲区,buf含有的字节将写入文件中
count
将要写入文件的字节数大小
返回值:
成功时,返回写入的字节数(零表示未写入任何字节),出现错误时,返回-1
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

int main()
{
	int fd;//open()返回值
	char *buf = "kangxiansen hen shuai";//buf缓冲区内容
	fd = open("./demo1", O_RDWR|O_CREAT,0600);
	printf("open success :fd = %d\n", fd);
	write(fd,buf,strlen(buf));//写入文件
	close(fd);//关闭文件
	return 0;
}

3、读取文件编程

#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
//read()尝试从文件描述符fd向缓冲区读取最多count个字节,放到buf里面。
返回值:
成功时,返回写入的字节数(零表示未写入任何字节),出现错误时,返回-1
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>

int main()
{
	int fd;//open()返回值
	char *buf = "kangxiansen hen shuai";//buf缓冲区内容
	fd = open("./demo1", O_RDWR|O_CREAT,0600);
	printf("open success :fd = %d\n", fd);
	int n_write = write(fd,buf,strlen(buf));//写入文件,并返回写入的字节数
	printf("write %d byte\n", n_write);
	close(fd);//写完后关闭文件,要让文件光标在开始位置
	fd = open("./demo1", O_RDWR);
	char *readBuf;//创建读取的缓冲区,注意野指针,要开辟空间
	readBuf = (char *)malloc(sizeof(char)* n_write + 1);
	int n_read = read(fd, readBuf, n_write);//读取文件,返回读取的字节数,理论上n_read=n_write
	printf("context:%s, count:%d\n", readBuf, n_read);
	close(fd);//关闭文件
	return 0;
}

*注意读取文件时光标的位置,写完文件后,光标位置是在内容的最后位置,读取文件是从光标位置往后读取,这是读取内容就为空,解决方法:
1、写完文件之后关闭文件,再打开文件读取;
2、写完文件之后移动光标到文件内容起始位置。
4、文件“光标”位置
lseek

#include <sys/types.h>
#include <unistd.h>
//原型
off_t lseek(int fd, off_t offset, int whence);
//lseek()重新定位与文件描述符fd关联的打开文件描述的文件偏移量offset,指令偏移参数whence
offset:
偏移量
whence:
SEEK_SET  移动光标文件头部
SEEK_CUR  移动光标文件当前位置
SEEK_END  移动光标文件尾部
返回值:
lseek()返回从文件开头开始的偏移位置(以字节为单位)。出现错误时,返回值-1
int fd = open("./file1", O_RDWR);
int filesize = lseek(fd, 0, SEEK_END);
printf("file size=%d\n", filesize);//就可以计算文件内容的大小

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>

int main()
{
	int fd;//open()返回值
	char *buf = "kangxiansen hen shuai";//buf缓冲区内容
	fd = open("./demo1", O_RDWR|O_CREAT,0600);
	printf("open success :fd = %d\n", fd);
	int n_write = write(fd,buf,strlen(buf));//写入文件,并返回写入的字节数
	printf("write %d byte\n", n_write);
	//close(fd);//写完后关闭文件,要让文件光标在开始位置
	//fd = open("./demo1", O_RDWD);
	char *readBuf;//创建读取的缓冲区,注意野指针,要开辟空间
	readBuf = (char *)malloc(sizeof(char)* n_write + 1);
	lseek(fd, 0, SEEK_SET);//光标移动到文件头部
	int n_read = read(fd, readBuf, n_write);//读取文件,返回读取的字节数,理论上n_read=n_write
	printf("context:%s, count:%d\n", readBuf, n_read);
	close(fd);//关闭文件
	return 0;
}

5、fopen、fwrite、fread函数
fopen函数与open函数的区别请参考https://blog.csdn.net/kangxiansen/article/details/118248575?spm=1001.2014.3001.5501

#include <stdio.h>
1) FILE *fopen(const char *pathname, const char *mode);打开文件
pathname:
文件路径
mode:
打开文件权限
        r   只读方式打开一个文本文件                           
        rb  只读方式打开一个二进制文件                         
        w   只写方式打开一个文本文件                           
        wb  只写方式打开一个二进制文件                         
        a   追加方式打开一个文本文件                           
        ab  追加方式打开一个二进制文件                         
        r+  可读可写方式打开一个文本文件                       
        rb+ 可读可写方式打开一个二进制文件                     
        w+  可读可写方式创建一个文本文件                       
        wb+ 可读可写方式生成一个二进制文件                     
        a+  可读可写追加方式打开一个文本文件                   
        ab+ 可读可写方式追加一个二进制文件
返回值:
FILE类型的文件名
2size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);写入文件
ptr:
缓冲区buf
size:
要写入一个字符大小
nmemb:
要写入字符个数
FILE *stream:
要写入的文件名
返回值:
返回写入的字节数=nmemb
3int fseek(FILE *stream, long offset, int whence);与lseek用法一样,移动光标
4size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);读取文件
ptr:
读取缓存区readBuf
返回值;
返回读取到的字节数
5int fclose(FILE *stream);关闭文件


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

int main()
{
	FILE *fp;
	char *str = "kangxiansen hen shuai";
	cahr readBuf[128]={0};
	
	fp = fopen("./file1", "a+");
	fwrite(str, sizeof(char), strlen(str), fp);
	fseek(fp, 0, SEEK_SET);
	fread = (readBuf, sizeof(char), strlen(str), fp);
	fclose(fp);
	printf("read data: %s\n", readBuf);
	return 0;
}

6、fputc函数,fgetc函数、feof函数

fputc 写入
int fputc(int c, FILE *stream);
int fputs(const char *s, FILE *stream);
int putc(int c, FILE *stream);
int putchar(int c);
int puts(const char *s);
fgetc读文件
int fgetc(FILE *stream);
feof判断是否到达文件尾巴
int feof(FILE *stream);
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值