文件IO--标准IO

一、标准IO

概念:标准是指遵循AVSI C标准,标准IO实际上是通过标准C库里面的函数来完成的。

特点:标准IO内部实现了一种缓冲机制 标准IO通过利用缓冲机制,减少系统调用的次数来提高程序执行效率;

标准IO一般用于访问普通文件,它是在文件IO的基础上添加了缓冲机制。

二、流

概念:文件IO操作简单从文件输入和输出数据,称为字节流,也叫作流。

流的类型:

1、文本流

文本流处理数据都是以字符的方式处理

最终所有数据都会转换为对应的ASCII码值处理

"hello" == 'h' 'e' 'l' 'l' 'o'

"1234"  == '1' '2' '3' '4'   对应的ASCII码值:49  50  51  51

文本流和二进制流处理换行符方式不一样(Windows下面,linux下面没有区别)

文 本 流:'\n' == '\r' '\n' 13 10

二进制流:'\n' == '\n'

2、二进制流

二进制流处理数据都是以转换成二进制处理

"1234" == 100 1101 0010 //直接转成二进制流

三种特殊流:

stdin  -- 标准输入流 -- 0 (键盘)

stdout -- 标准输出流 -- 1 (终端)

stderr -- 标准错误流 -- 2

三、缓冲区

1、全缓存:当打开一个普通文件时,默认使用全缓存

特点:只有当缓冲区满或者空时才能进行实际的读写操作

2、行缓存:当打开操作的文件跟终端相关时,使用行缓存

特点:当行缓存遇到'\n'或者缓冲区满的情况下才做读写操作

3、无缓存:当需要输出打印错误结果时用无缓存

特点:

四、标准IO相关函数

{

fopen()/fclose()

fgetc()/fputc()

fgets()/fputs()

fread()/fwrite()

feof()/ferror()

ftell()/fseek()/rewind()

}

首先先提一下利用man查看函数的使用方法:

{

man 1:可执行程序和shell命令

man 2:系统调用函数

man 3:标准库函数

}

1、打开文件 

 fopen()

#include <stdio.h>//头文件

FILE *fopen(const char *path, const char *mode)//函数原型

参数:

path:打开的文件名(可包含文件路径)

mode:打开文件方式

r :以只读方式打开文件 -- 文件不存在,则无法打开文件,打开文件会清空文件内容

r+:以读写方式打开文件 -- 文件不存在,则无法打开文件,打开文件会清空文件内容

w :以只写方式打开文件 -- 文件不存在,则创建文件在打开,打开文件会清空文件内容

w+:以读写方式打开文件 -- 文件不存在,则创建文件在打开,打开文件会清空文件内容

a :以只写方式打开文件 -- 如果文件不能存在则会先创建,并在文件末尾追加输入内容

a+:以只写方式打开文件 -- 如果文件不能存在则会先创建,并在文件末尾追加输入内容//换行追加

返回值:成功返回流指针,失败返回-1;

举例:FILE *fp = fopen("1.txt", "r+");

2、关闭流

 fclose()

#include <stdio.h>//头文件

int fclose(FILE *fp)//函数原型

参数:关闭文件对应的流指针

返回值:成功返回0,失败返回-1.

举例:fclose(fp);

3、错误处理

errno:错误号

strerror()

(1) #include <string.h>

#include <errno.h>//需要添加头文件

char *strerror(int errnum)//函数原型

参数:

errno:错误号

返回值:

成功返回错误的字符串,失败返回"Ukown error!"

perror()

(2) #include <stdio.h>

void perror(const char *s);//比较常用

参数:

s:错误信息,随意填一个字符串

perror()//可以直接打印错误,不用添加头文件

举例:

if(NULL == fp)

{

// perror("open 1.txt.");

printf("%s\n",strerror(errno));

return -1;

}

4、按字节输入输出

fgetc()

#include <stdio.h>

int fgetc(FILE *stream)

功能:向指定流中输入单个字节

参数:

stream:对应的流指针

返回值:

成功:返回得到的字符

失败或者读到文件末尾:返回-1

fputc()

#include <stdio.h>

int fputc(int c, FILE *stream);

功能:向指定流中输出指定字符

参数:

c:要输出的字符

stream:指定的流指针

返回值:成功返回输出字符,失败或者读到文件末尾返回-1;

练习:

1、计算一个文件的大小

2、实现文件的复制

5、按行进行输入和输出

fgets()

#include <stdio.h>

char *fgets(char *s, int size, FILE *stream);

返回值:

成功返回得到输入字符串的首地址,失败返回NULL;

参数:

s:输入数据的首地址

size:输入一行数据的大小

stream:对应文件的流指针

注意:

fgets()输入时遇到'\n'结束

最大输入的字节数为(size-1)个

fputs()

#include <stdio.h>

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

参数:

s:输入数据的首地址

stream:对应文件的流指针

返回值:失败返回-1

练习:

1、计算文件的行数

2、实现文件的复制

6、按对象输入输出数据

fread()

void *表示可以传入任意类型的指针

#include <stdio.h>

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

参数:

ptr:存放读取内容的首地址

size:一个对象的字节数大小(一次读多大字节的对象)

nemmb:读取对象的个数

stream:对应文件的流指针

返回值:

成功返回读写的对象个数

fwrite()

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

参数:

ptr:存放写入内容的首地址

size:一个对象的字节数大小(一次写多大字节的对象)

nemmb:写入对象的个数

stream:对应文件的流指针

返回值:

成功返回读写的对象个数

7、判断错误流 -- feof、ferror

feof()

#include <stdio.h>

int feof(FILE *stream);

返回值:

返回1表示只读到文件末尾,0表示失败

ferror()

int ferror(FILE *stream);

返回值:

返回1表示错误退出,0表示失败

8、刷新流fflush()

#include <stdio.h>

int fflush(FILE *stream);

参数:

stream:流指针

返回值:

成功返回0,失败返回-1;

9、定位流(文件指针)

-- ftell / fseek / rewind

#include <stdio.h>

ftell()

long ftell(FILE *stream);

参数:

stream:流指针

返回值:

成功返回文件指针相对于文件开头的偏移量,失败返回-1

fseek()

int fseek(FILE *stream, long offset, int whence);

参数:

stream:流指针

offset:偏移量

whence:定位基准点

{

SEEK_SET:定位在文件开头

SEEK_CUR:定位在文件指针当前位置

SEEK_END:定位在文件末尾

}

流的定位等于:偏移量+基准点

rewind()

功能:

void rewind(FILE *stream);

将文件指针定位在文件开头

sprintf

10、获取时间

ctime

#include <time.h>

time(&t);

char *ctime(const time_t *timep);

time

time_t time(time_t *tloc);

返回值:

成功返回字符串

localtime

struct tm *localtime(const time_t *timep);

truct tm {

              int tm_sec;    /* Seconds (0-60) */

              int tm_min;    /* Minutes (0-59) */

              int tm_hour;  /* Hours (0-23) */

              int tm_mday;  /* Day of the month (1-31) */

              int tm_mon;    /* Month (0-11) */

              int tm_year;  /* Year - 1900 */

              int tm_wday;  /* Day of the week (0-6, Sunday = 0) */

              int tm_yday;  /* Day in the year (0-365, 1 Jan = 0) */

              int tm_isdst;  /* Daylight saving time */

          };

12、sprintf--补充

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

参数:

str:输入数据的首地址

format:要写入str中的文本

练习:向文件中每隔一秒写入当前行数和时间

主要在于sprintf()的使用方法

第一天学习文件IO的笔记!!!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值