标准IO与文件IO

Linux下文件类型:

a.文本文件 b.二进制文件

目录文件:d  dir

块设备文件:b block

字符设备文件:c char

管道文件:p  piple

链接文件:l link

套接字文件:s socket

一、标准IO

特点:c库函数、带缓冲、通过流指针来操作(FILE *)、一般用于普通文件的操作

函数、API、接口都是一个说法

1.FILE指针和流

流:字节的进进出出

FILE指针:每个被使用的文件都在内存中开辟一片区域,用来保存文件的相关信息,这些信息保存在结构体类型变量中,该结构体类型是系统定义的,取名为FILE

在标准Io中所有的操作都是围绕流来进行的,在标准IO中用FILE* 来描述

2.相关操作

(1)打开文件

FILE *fp = NULL;

fp = fopen(argv[1],"w");

if(NULL == fp)

{

        perror("open error");

        return -1;

}

(2)关闭文件

fclose(fp);     

返回值:成功返回0,失败返回EOF

注意:EOF只能判断是否到达文件的末尾

(3)操作文件

a.按字符读写

int fgetc(FILE *stream);//要操作的流

int fputc(int c,FILE *stream);//要输入的字符的ASCII码   要操作的流


//显示指定文件的内容
//打开文件
FILE *fr = fopen(argv[1],"r");
if(NULL == fr)
{
    perror("open error");
    return -1;
}
//操作文件
char ch;
whle(1)
{
    ch = fgetc(fr);
    if(EOF == ch)
    {
        break;
    }
    fputc(ch,stdout);
}
//关闭文件
fclose(fr);

案例:实现文件的拷贝(用两个文件就行)

//打开文件1
FILE *fr = fopen(argv[1],"r");
if(NULL == fr)
{
    perror("open error");
    return -1;
}
//打开文件2
FILE *fw = fopen(argv[2],"w");
if(NULL == fw)
{
    perror("open error");
    return -1;
}

char ch;
//操作文件
while(1)
{
    ch = fgetc(fr);
    if(EOF == ch)  //if(feof(fr))    
    {
        break;
    }
    fputc(ch,fw);
}

//关闭文件
fclose(fr);
fclose(fw);

 int feof(FILE*stream);//测试是否到达文件末尾,非0表示到达文件末尾,为0表示没有到达未见末尾

//feof既能判断是否到达文本文件的末尾,也能判断是否到达二进制文件的末尾

b.按行读写

char *fgets(char *s,int size,FILE *stream);//从指定的流中读取一串字符

//1.读到的内容空间的首地址

//2.要读取的字节数

//3.要操作的流

char str[5] = {0};
fgets(str,sizeof(str),stdin);

puts(str);

 

 

注意:(1):fgets做多读取SIZE-1个字符(2)如果读取小于SIZE,会把换行也读进去

int fputs(const char *s,FILE *stream);

成功返回非负整数,失败返回-1

char str[5] = {0};
fgets(str,sizeof(str),stdin);

fputs(str,stdout);

 

 案例:实现文件的拷贝cp

FILE *fr = fopen(argv[1],"r");
if(NULL == fr)
{
    perror("open file1 error");
    return -1;
}
FILE *fw = fopen(argv[2],"w");
if(NULL == fw)
{
    perror("open file2 error");
    return -1;
}
char buf[1024] = {0};
while(1)
{
    memset(buf,0,sizeof(buf));
    char *atr = fgets(buf,sizeof(buf),fr);
    if(NULL == atr)
    {
        break;
    }
    fputs(buf,fw);
}
fclose(fr);
fclose(fw);

c.按块读写

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

//fread(buf,1,sizeof(buf),fr);

size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);

要写的内容的首地址   块的大小   块的个数   要操作的流

//fwrite(&Stu,1,sizeof(Stu),fr);

long ftell(FILE *stream);  //获取文件的位置

int fseek(FILE *stream,long offset,int whence);  //获取文件流的位置

SEEK_CUR:当前位置

SEEK_END:文件末尾

SEEK_ SET:文件开头

文件IO

特点:系统调用、无缓冲机制、文件描述符、一般用于设备文件的操作

一.相关函数

1.打开文件

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

O_RDONLY: 只读; O_WRONLY:只写     O_RDWR:可读可写

其余的和上面进行或运算

O_CREAT:如果文件不存在,则新建(必须使用第三个参数)

O_EXCL:如果使用O_CREAT时文件存在,则可返回错误消息。这一参数可测试文件是否存在。

int fd = open(argv[1],O_RDONLY | O_CREAT | O_EXCL,0664);

2.关闭文件

#include <unistd.h>

int close(int fd);

close(fd);

3.文件掩码

测试OS最多能同时打开多少个文件

int sprintf(char *str, const char *format, ...);

注意:程序运行起来之后有3个文件已经默认打开,标准输入、标准输出、标准出错

stdin stdout stderr

4.操作文件

#include <unistd.h>

ssize_t read(int fd, void *buf, size_t count);

//read(fr,&stu,sizeof(Stu));

ssize_t write(int fd, const void *buf, size_t count);

//write(fw,&stu,sizeof(Stu));

off_t lseek(int fd, off_t offset, int whence);//获取文件流的位置

//fseek(fp,10,SEEK_CUR);//从当前位置向后偏移10个字节

二、目录

1.打开目录

#include <sys/types.h>

#include <dirent.h>

DIR *opendir(const char *name);

2.操作目录

#include <sys/types.h>

struct dirent *readdir(DIR *dirp)

3.关闭目录

#include <sys/types.h>

#unclude <dirent.h>

int closedir(DIR *dirp)

DIR *p = opendir(argv[1]);
{
    if(NULL == p)
    {
        perror("open error");
        return -1;
    }
    struct dirent *pp = NULL;
    while(1)
    {
        pp = readdir(pDir)
        if(NULL == pp)
        {
            break;
        }
        if(pp->d_name[0] != '.')
        {
        
        printf("%s "pt->d_name);
        }
    }
    closedir(pDir);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值