系统调用open () ,read(),write(),lseek();
库函数fopen(), fread(),fwrite(),flseek();
库函数
1.fopen()函数
函数功能 | 打开文件 |
头文件 | #include<stdio.h> |
函数原型 | FILE *fopen(const char *path ,const char *mode) |
参数说明 | §path:欲打开的文件路径与文件名 §mode:打开方式: “r”:以只读方式打开文件 “r+”:以可写可读方式打开文件 “w”:以只写方式打开文件 “w+”:以可读可写的方式打开文件,若文件不存在则建立文件 “a”:以追加的方式打开文件,若文件不存在则建立文件; 若文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。 “a+”:相对“a”功能的基础上,以追加方式打开可读可写的文件。 |
返回值 | 文件打开成功,返回文件指针; 文件打开失败,则返回NULL,并把错误码存在errno中 |
范例: #include<stdio.h> Main() { FILE *fp; fp=fopen(“hell.txt”,”a+”); if(fp==NULL) return: fclose(fp); } |
1. open()函数
所需头文件 | #include <sys/types.h> #include <sys/stat.h > #include <fcntl.h>
| |
函数原型 | (1)Int open(const char *pathname, int flags); (2)Int open(const char *pathname, int flags, mode_t mode ); | |
区别当flag使用了O_CREAT标志,则使用第二种形式,这时需要mode来指定访问权限
| ||
函数传入值 | Pathname | §Pathname:要打开的文件路径和文件名
|
§flags:打开方式,必须从下面三个中选一个: | O_RDONLY:只读模式; | |
O_WRONLT:只写模式 | ||
O_RDWR:读写模式; | ||
§flags:另外,还可以附加选项,通过与上面3个选项通过”|”连接 | O_APPEND:每次写操作都写入文件的末尾; | |
O_CEAT:如果指定文件不存在,则创建这个文件; | ||
O_EXCL:如果要创建的文件已存在,则返回-1,并且修改errno的值,需要与O_CREAT配对使用以确保文件是新建的。 | ||
O_TRUNC:如果文件存在,并且以只写/读写方式打开,则清空文件全部内容(即长度截短为0)。 | ||
O_NOCTTY:如果路径名指向终端设备,不要把这个设备用作控制中端; | ||
函数返回值:成功返回文件描述符; 失败返回:-1; |
范例:
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
main()
{
int fd,size;
char s [ ]=”Linux Programmer!\n”,buffer[80];
fd=open(“/tmp/temp”,O_WRONLY|O_CREAT);
write(fd,s,sizeof(s));
close(fd);
fd=open(“/tmp/temp”,O_RDONLY);
size=read(fd,buffer,sizeof(buffer));
close(fd);
printf(“%s”,buffer);
}
2.fseek()函数
函数功能 | 移动文件流的读写位置 |
头文件 | #include<stdio.h> |
函数原型 | Int fseek(FIEL * stream , long offset , int origin) |
参数说明 | §stream:文件指针 §offset:偏移量,正数表示正向偏移,负数表示负向偏移 §origin:设定从文件的哪里开始偏移,可能取值为: SEEK_SET:文件开头 SEEK_CUR:当前位置 SEEK_END:文件结尾 |
返回值 | 成功,返回0; 失败,返回-1; |
范例: #include<stdio.h> Long filesize(FILE *stream) { FILE *stream; Stream=fopen(“MYFILE.txt”,“w+”); fprintf (stream ,“this is a test”); printf(“filesize of MYFILE.txt is %ld bytes\n” ,filesize(stream) ); return 0; } Long filesize(FILE *stream) { Long curpos ,length; Curpos=ftell(stream); Fseek(stream, 0L ,SEEK_END); Length=ftell(stream); //*ftell(fd)求文件总长度 fseek=(stream ,curpos ,SEEK_SET); return length; } |
2. lseek()函数
函数功能 | 移动文件读写指针 |
头文件 | #include <sys/types.h> #include <unistd.h> |
函数原型 | Off_t lseek(int fd, off_t offset, int whence) |
参数说明 | §Fd:文件描述符 §offset:偏移量,正数表示正向偏移量,负数表示负向偏移量 §whence:设定从文件的哪里开始偏移,可取值为: SEEK_SET:文件开头 SEEK_CUT:当前位置 SEEK_END:文件结尾 (其中SEEK_SET、SEEK_CUT、SEEK_END:0,1和2) |
返回值 | 当调用成功则返回目前的读写位置相对头文件的偏移量,(即距文件开头多少字节,若有错误则返回-1,errno会存放错误代码) |
范例 | 1. 欲将读写位置移到文件开头时: lseek(int fd, 0, SEEK_SET) 2. 欲将读写位置移到文件结尾时: lseek(int fd, 0, SEEK_CUT) 3. 欲将读写位置移到当前位置时: lseek(int fd, 0, SEEK_END) |
3.fread()函数
函数功能 | 从一个流中读数据 |
头文件 | #include<stdio.h> |
函数功能 | Int fread(void *ptr ,int size ,int nitems, FILE *stream) |
函数说明 | §ptr:用于接收数据的地址(指针) §size:每个字段中所含字节数 §nitems:要读取的总字段数; §stream:提供数据的文件指针 |
返回值 | 成功返回读取的元素个数 |
范例:
|
3.read()函数
函数功能 | 由打开的文件读写数据 |
头文件 | #include <unistd.h> |
函数原型 | Ssize_t read(int fd, void *buf , size_t count) |
参数说明 | §fd:文件描述符 §buf:存放读取数据的缓冲区 §count:读取的最大长度(字节数) |
返回值 | 成功返回实际读取的字节数,失败返回-1 |
4.write()函数
函数功能 | 向文件写入一个数据块 |
函数原型 | Ssize_t write(int fd ,const void *buf ,size_t count) |
参数说明 | §fd:文件描述符 §buf:写入数据的缓冲区 §count:写入数据的最大长度(总字节数) |
返回值 | 成功返回实际写入字节数,当有错误发生时则返回-1,错误代码存入errno |
4.fwrite()函数
函数功能 | 向文件写入一个数据块 |
头文件 | #include<stdio.h> |
函数功能 | Int fwrite(const void* buffer ,size_t size , size_t count, FILE *stream) |
函数说明 | §ptr:用于输入的数据的地址(指针) §size:每个字段中所含字节数 §nitems:要读取的总字段数; §stream:提供数据的文件指针 |
返回值 | 成功返回写入的元素个数 |