Smart210学习记录-------文件操作

一.linux文件操作(只能在linux系统上用)

创建:
int creat(const char* filename, mode_t mode)
filename 表示要创建的文件名,mode表示对该文件的读写权限
int umask(int newmask)
调用将 umask 设置为 newmask,然后返回旧的 umask,它只影响读、写和执行权限
S_IRUSR 用户可以读
S_IWUSR 用户可以写
S_IXUSR 用户可以执行
。。。等等
除了可以通过上述宏进行“或”逻辑产生标志以外,我们也可以自己用数字来表示,Linux
用 5 个数字来表示文件的各种权限:第一位表示设置用户 ID;第二位表示设置组 ID;第三位表
示用户自己的权限位;第四位表示组的权限;最后一位表示其他人的权限。每个数字可以取 1(执
行权限)、2(写权限)、4(读权限)、0(无)或者是这些值的和。例如,要创建一个用户可读、
可写、可执行,但是组没有权限,其他人可以读、可以执行的文件,并设置用户 ID 位。那么,
我们应该使用的模式是 1(设置用户 ID)、0(不设置组 ID)、7(1+2+4,读、写、执行)、0(没
有权限)、5(1+4,读、执行)即 10 705:


打开:
int open(const char* filename, int flags)
int open(const char* filename, int flags, mode_t mode)
open()函数有两个形式,其中 pathname 是我们要打开的文件名
O_RDONLY 以只读的方式打开文件
O_WRONLY 以只写的方式打开文件
O_RDWR 以读写的方式打开文件
O_APPEND 以追加的方式打开文件
O_CREAT 创建一个文件 //使用第二种形式
O_EXEC 如果使用了 O_CREAT 而且文件已经存在,就会发生一个错误
O_NOBLOCK 以非阻塞的方式打开一个文件
O_TRUNC 如果文件已经存在,则删除文件的内容

open("test", O_CREAT, 10 705) 创建一个text文件并且打开它,对它的权限用户ID读写,组ID没权限,用户自己读写运行。。。。
如果文件打开成功,open 函数会返回一个文件描述符,以后对该文件的所有操作就可以通过
对这个文件描述符进行操作来实现。


读写;
int read(int fd, const void* buf, size_t length)
int write(int fd, const void *buf, size_t length)
返回值为实际写入的字节数
fd:open函数返回的文件描述符
buf length 顾名思义

定位:
对于随机文件,我们可以随机地指定位置读写,使用如下函数进行定位:
int lseek(int fd, offset_t offset, int whence)

fd:文件描述符
offset:相对于whence的偏移量
whence:SEEK_SET:相对文件开头
SEEK_CUR:相对文件读写指针的当前位置
SEEK_END:相对文件末尾

关闭:
int close(int fd)
当我们操作完成以后,我们要关闭文件了,只要调用 close 就可以了,其中 fd 是我们要关闭
的文件描述幅

范例:
1 #include <sys/types.h>
2 #include <sys/stat.h>
3 #include <fcntl.h>
4 #include <stdio.h>
5 #define LENGTH 100
6 main()
7 {
8 int fd, len;
9 char str[LENGTH];
10
11 fd = open("hello.txt", O_CREAT | O_RDWR, S_IRUSR | S_IWUSR); /*
12 创建并打开文件 */
13 if (fd) {
14 write(fd, "Hello World", strlen("Hello World")); /*
15 写入字符串 */
16 close(fd);
17 }
18
19 fd = open("hello.txt", O_RDWR);
20 len = read(fd, str, LENGTH); /* 读取文件内容 */
21 str[len] = '\0';
22 printf("%s\n", str);
23 close(fd);
24 }

 

 

 


二.c库文件操作(C库函数的文件操作实际上是独立于具体的操作系统平台的,不管是在DOS、Windows、Linux,还是在 VxWorks 中都是这些函数)


创建与打开

FILE* fopen(const char* path, const char* mode);
mode: 打开模式 r、rb 以只读方式打开
w、wb 以只写方式打开。如果文件不存在,则创建该文件,否则文件被截断
a、ab 以追加方式打开。如果文件不存在,则创建该文件
r+、r+b、rb+ 以读写方式打开
w+、w+b、wh+ 以读写方式打开。如果文件不存在时,创建新文件,否则文件被截断
a+、a+b、ab+ 以读和追加方式打开。如果文件不存在,则创建新文件
其中 b 用于区分二进制文件和文本文件,这一点在 DOS、Windows 系统中是有区分的,但
Linux 不区分二进制文件和文本文件。

读写:

C 库函数支持以字符、字符串等为单位,支持按照某种格式进行文件的读写,这一组函数为:

int fgetc(FILE *stream);
int fputc(int c, FILE *stream);
char *fgets(char *s, int n, FILE *stream);
int fputs(const char *s, FILE *stream);
int fprintf(FILE *stream, const char *format, ...);
int fscanf (FILE *stream, const char *format, ...);
size_t fread(void *ptr, size_t size, size_t n, FILE *stream);
size_t fwrite (const void *ptr, size_t size, size_t n, FILE *stream);

fread()实现从流 stream 中读取加 n 个字段,每个字段为 size 字节,并将读取的字段放入 ptr
所指的字符数组中,返回实际已读取的字段数。在读取的字段数小于 num 时,可能是在函数调用
时出现错误,也可能是读到文件的结尾。所以要通过调用 feof()和 ferror()来判断。
write()实现从缓冲区 ptr 所指的数组中把 n 个字段写到流 stream 中,每个字段长为 size 个字
节,返回实际写入的字段数。
另外,C 库函数还提供了读写过程中的定位能力,这些函数包括:
int fgetpos(FILE *stream, fpos_t *pos);
int fsetpos(FILE *stream, const fpos_t *pos);
int fseek(FILE *stream, long offset, int whence);


关闭:

int fclose(FILE* stream);

范例:
#include <stdio.h>

 

int main()
{
FILE* fd;
char pr[15];
fd = fopen("hello.doc", "w+");
if (fd){
fputs("hello world", fd);
fcolse(fd);
}

fd = fopen("hello.doc", "r");
fgets(pr, 15, fd);
printf("%s\n", pr);
fclose(fd);
}

 

来自<<linux设备驱动开发详解>>

posted @ 2016-04-20 15:29  Grace、  阅读(290)  评论(0编辑  收藏  举报