文件IO和标准IO

文件 IO 是 Linux 系统提供的接口,针对文件和磁盘进行操作,不带缓存机制;
标准 IO 是 C 语言函数库里的标准 I/O 模型,在 stdio.h 中定义,通过缓冲区操作文件,带缓存机制。

Linux 系统中一切皆文件,包括普通文件,目录,设备文件(不包含网络设备),管道,fifio 队列,socket 套接字等,在终端输入“ls -l”可查看文件类型和权限。

标准IO文件IO
打开/创建fopenopen
getc,fgetc,getchar,fgets,gets,freadread
putc,fputc,puts,fputs,fwritewrite
关闭fcloseclose

本节使用 Linux 提供的接口来进行打开关闭文件。

open():

通过系统调用,可以打开文件,并返回文件描述符:

函数定义:
#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_CREAT 要打开的文件名不存在时自动创建改文件。
O_EXCL 要和 O_CREAT 一起使用才能生效,如果文件存在则 open()调用失败。
O_RDONLY 只读模式打开文件。
O_WRONLY 只写模式打开文件。
O_RDWR 可读可写模式打开文件。
O_APPEND 以追加模式打开文件。
O_NONBLOCK 以非阻塞模式打开。
mode: 权限掩码,对不同用户和组设置可执行,读,写权限,使用八进制数表示,此参数可不写。
返回值:
open()执行成功会返回 int 型文件描述符,出错时返回-1。

close()可以关闭文件,通过系统调用取消文件描述符到文件的映射。
函数定义:
#include <unistd.h>
int close(int

read():

读取文件最常用的函数,定义如下:
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
参数含义:
fd: 要读的文件描述符
buf: 缓冲区,存放读到的内容。
count: 每次读取的字节数
函数功能:
每次从 fd 读取 count 个字节,保存到 buf 中。
返回值:
返回值大于 0,表示读取到的字节数;
等于 0 在阻塞模式下表示到达文件末尾或没有数据可读(EOF),并调用阻塞;
等于-1 表示出错,在非阻塞模式下表示没有数据可读。

write():

常用来写文件,定义如下:
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
参数含义:
fd: 文件描述符;
buf: 缓存区,存放将要写入的数据;
count: 每次写入的个数。
函数功能:
每次从 buf 缓存区拿 count 个字节写入 fd 文件。
返回值:
大于或等于 0 表示执行成功,返回写入的字节数;
返回-1 代表出错。

常用函数如下:

opendir():

打开指定的目录,并返回 DIR*形态的目录流,
#include <sys/types.h>
#include <dirent.h>
DIR *opendir(const char *name);
参数含义:
name:路径名字。
返回值:成功返回打开的目录流,失败返回 NULL。
closedir():关闭目录流。
#include <sys/types.h>
#include <dirent.h>
int closedir(DIR *dirp);
参数含义:dirp:要关闭的目录流指针。

标准 IO 使用了缓冲区机制,从而减少系统调用,实现更高的效率,三种缓冲机制为:
全缓冲:当流的缓冲区无数据或无空间时才执行实际 I/O 操作
行缓冲:当在输入和输出中遇到换行符(‘\n’)时,进行 I/O 操作。
无缓冲:数据直接写入文件,流不进行缓冲。
常用函数如下:

fopen():

打开或创建文件流,返回指向该文件流的指针
#include <stdio.h>
FILE *fopen(const char *path, const char *mode);
参数含义:
filename :字符串,用来命名文件;
mode:访问模式,有以下几种选项:
r:打开一个已有的文本文件,允许读取文件;
w:打开一个文本文件,允许写入文件。如果文件不存在,则会创建一个新文件;
a:打开一个文本文件,以追加模式写入文件。如果文件不存在,则会创建一个新文件;
r+:打开一个文本文件,允许读写;
w+:打开一个文本文件,允许读写文件,如果文件不存在,则会创建一个新文件,如 果文件已
存在, 则文件会被截断为零长度,
a+:打开一个文本文件,允许读写文件。如果文件不存在,则会创建一个新文件,读取 会从文件
的开头开始,写入则只能是追加模式
返回值:返回一个 FILE 对象,FILE 对象包含了用来控制流的方法。

fclose():

关闭文件
#include <stdio.h>
int fclose(FILE *stream);
参数含义:打开的文件流对象
返回值:成功关闭文件,函数返回零,如果关闭文件时发生错误,函数返回 EOF

fgets():

从文件流中读取一行,并把它存储在 s 所指向的字符串内,
#include <stdio.h>
char *fgets(char *s, int size, FILE *stream);
参数含义:
s:数组指针,读到的字符串储存在此数组内;
size:读取的字符数量,通常填写数组长度;
stream:打开的文件流。
返回值:读取成功返回与 s 相同的参数,错误返回一个空指针。
fread():从文件流 stream 中读 nmemb 个元素到 ptr 指向的内存中,每个元素有 size 个字节。
#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
参数含义:
ptr:指向内存块的指针;
size:每个元素的字节数;
nmemb:一次读取的元素个数;
stream:打开的 FILE 对象的指针。
返回值:如果返回结果与 nmemb 不同,则发生了一个错误或达到了文件末尾

fwrite():

把 ptr 所指向的数组中的数据写入到给定流 stream 中,
#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
参数含义:
ptr:指向内存块的指针;
size:每个元素的字节数;
nmemb:一次写入的元素个数;
stream:打开的 FILE 对象的指针。
返回值:成功返回写入元素的个数,如果该数字与 nmemb 不同会显示错误。

#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>

int main(int argc,char *argv[])
{
    char buf[8]={0};
    int rlen,wlen;
    int fd = open("./hello",O_RDWR);
    int fd1 = open("./temp.txt",O_CREAT|O_RDWR);
    if(fd == -1 || fd1 == -1)
    {
        perror("open");
        return -1;
    }
    do{
        rlen = read(fd,buf,8);
        wlen = write(fd1,buf,rlen);
        printf("%s",buf);
        memset(buf,0,8);
    }while (rlen > 0 && wlen > 0);
    printf("ok\n");
    close(fd);
    close(fd1);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值