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类型的文件名
2) size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);写入文件
ptr:
缓冲区buf
size:
要写入一个字符大小
nmemb:
要写入字符个数
FILE *stream:
要写入的文件名
返回值:
返回写入的字节数=nmemb
3) int fseek(FILE *stream, long offset, int whence);与lseek用法一样,移动光标
4) size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);读取文件
ptr:
读取缓存区readBuf
返回值;
返回读取到的字节数
5)int 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);