目录
char *fgets(char *s, int size, FILE *stream);
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
标准IO与文件IO
IO就是针对文件的输入与输出
文件分类
基本分类
1、文本文件(ASCII码文件),文件中的内容是用ASCII码或者字符来显示的 2、二进制文件:文件当中存放的内容是二进制数据。 两个文件在物理存储上没有差别(对于计算机来说都是二进制方式处理),逻辑有差别(文件的编码方式不同) linux系统文件分类: 普通文件:- 目录文件:d 管道文件:p 套接字文件:s 链接文件:l 块设备文件:b 字符设备文件:c
linux文件的操作
标准IO
标准IO是由ANSI c标准提供的c语言标准函数库 文件流:指数据像水流一样,所有的I/O操作仅是简单的从程序进或移除,这种字节流(比特流),就称为流。 FILE* 是指文件指针类型,在类型指向是一个结构体,该结构体描述了文件相关信息,每一个应用程序会默认定义三个文件流指针:stdio stdout、stderr stdin:标准输入流 stdout:标准输出流 stderr:标准错误流 man手册: man 1:查看shell命令 man 2:查看系统调用 man 3:查看c标准库
文件打开操作
1、打开 -- fopen
FILE *fopen(const char *path, const char *mode);
path:表示文件路劲字符串 mode:打开文件的方式 ”r“:只读打开,不会创建文件、文件流指针默认指向开头 ”r+“:读写打开,不会创建文件、文件流指针默认指向开头 “w”:只写打开,会创建文件(文件不存在时)或清空文件(文件存在),文件流指针默认指向开头 “w+”:读写打开,会创建文件(文件不存在时)或清空文件(文件存在),文件流指针默认指向开头 “a”:只写打开,会创建文件(文件不存在时)或追加内容(文件存在)。 “a+”:读写打开,会创建文件(文件不存在时)或追加内容(文件存在)。 ”b“:以二进制流方式,需要与前六个方式组合使用 返回值: NULL:表示错误返回 正确返回文件指针流:该指针可以认为指向一个文件(path路径文件),因此利用该指针就可以间接操作文件。
读取文件操作
int fgetc(FILE *stream)
int fgetc(FILE *stream)
从指定文件中读取一个字符, 并且将字符返回. stream: 返回值: EOF:文件末尾 或 错误 正确返回当前读取的字符
char *fgets(char *s, int size, FILE *stream);
char *fgets(char *s, int size, FILE *stream);//从指定文件读取一行,因为遇到‘\n’结束
意义: 从指定文件中读取一行数据. 当遇到'\n'表示一行读取结束. 1.当size的值小于等于文件中一行数据的个数时, 读取的实际字符数是size-1,最后会默 认加一个'\0' 2.当size-1的值 大于 文件中一行数据的个数时,遇到'\n'正常结束. 并且读取到的内容 包含'\n' 3.两种情况都必须以'\0'为结束标志. s: 数据首地址 size: 想要读取一行文件内容的字节数 stream: 文件流指针 返回值: NULL: 错误返回 正确返回数据首地址.
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
意义:按照指定的个数对文件进行数据读取.(这里的个数不是指字节数..) ptr: 数据首地址,可以为任意指针类型. size: 一个数据的字节大小 例子: 读取整数数据的话 size = sizeof(int) nmemb: 想要读取的数据个数. stream: 文件流指针 返回值: 错误 或 文件末尾: 0 或 比nmemb小的数字 正确返回成功读取到的数据个数. 因为fread函数不作错误返回还是结尾返回,如果要知道原因需要调用函数 判断出错或者是文件末尾可以使用以下函数(只有fread函数需要,只有读取需要判断): feof(): 判断是否到达文件末尾. 用法: if(foef(fp) != 0) ferror()://非零表示结尾退出 判断文件操作是否出错. 用法: if(ferror(fp) != 0)// 非零表示错误退出
写入文件
int fputc(int ch, FILE *stream):向文件写入一个字符.
int fputs(const char *s, FILE *stream): 向文件写入一串数据. s表示数据的首地址.
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
返回值: 错误: 0 或 比nmemb小的数字 正确返回成功写入的数据个数.
关闭----fclose()
int fclose(FILE *stream); 成功返回 0 失败返回 EOF
使用相关函数复制任意大小的文件(包括图片)
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
int main(int argc, char *argv[])
{
FILE* fd1 = NULL;
FILE* fd2 = NULL;
char buf[13] = {0} ;
int ret;
fd1 = fopen("./jp.jpg","rb");
if(NULL == fd1)
{
printf("open demo1 failed\n");
return -1;
}
fd2 = fopen("fread3.jpg","wb");//打开、创建一个新文件
if(NULL == fd2)
{
printf("open failed\n");
return -1;
}
while(1)
{
ret = fread(buf,1,1,fd1);//读取文件到buf
if(0 == ret)
{
if(ferror(fd1) != 0)
{
printf("fread failed\n");
return -1;
}else
{
printf("end of file\n");
break;
}
}
ret = fwrite(buf,1,1,fd2);
{
if(ret == 0 )
{
return -1;
}
}
memset(buf,0,sizeof(buf));
}
fclose(fd1);
fclose(fd2);
return 0;
}
~