C标准IO的fread和fwrite

来源:互联网 发布:21天学通c语言百度云 编辑:程序博客网 时间:2024/05/01 15:15

吐舌头使用fread和fwrite操作文件

/*************************************************************************> File Name: frw.c> Author: XXDK> Email: v.manstein@qq.com > Created Time: Mon 13 Mar 2017 01:44:46 AM PDT ************************************************************************/#include<stdio.h>#include<stdlib.h>#include<string.h>typedef struct THAAD{char name[10];char country[10];int battle_field;}THAAD_t;void init_THAAD(THAAD_t* pthaad){strcpy(pthaad->name, "THAAD-OK");strcpy(pthaad->country, "USA");pthaad->battle_field = 1000;}int main(){THAAD_t thaad;THAAD_t thaad_k;init_THAAD(&thaad);FILE *fp = fopen("./test.c", "w+");fwrite(&thaad, sizeof(thaad), 1, fp);rewind(fp);fread(&thaad_k, sizeof(thaad_k), 1, fp);printf("thaad-k:\n");printf("name: %s\n", thaad_k.name);printf("country: %s\n", thaad_k.country);printf("battle field: %d\n", thaad_k.battle_field);return 0;}

文件:一组相关数据的有序集合。

文件名:这个数据集合的名称。


b:块文件、位进制文件
c:字符设备文件
d:目录
-:普通文件
l:符号文件
s:套接字文件
p:管道文件


库函数和系统调用
库函数:
库函数为了实现某个功能而封装起来的API集合


提供统一的编程接口,更加便于应用程序的移植


是语言或者应用程序的一部分
系统调用:
用户空间进程访问内核的接口

把用户从底层的硬件编程中解放出来

极大的提高了系统的安全性

使用户程序具有可移植性

是操作系统的一部分


文件描述符:顺序分配的非负整数;0、1、2在进程创建时由内核自动为我们分配


0:标准输入-》stdin
1:标准输出-》stdout
2:标准错误输出-》stderr


标准IO和文件IO的主要区别:缓存


标准IO
操作对象:FILE指针:每个被使用的文件都在内存中开辟一个区域,用来存放文件的有关信息,这些信息是保存在一个结构体类型的变量中,该结构体类型是由系统定义的,取名为FILE。
(在libio.h中定义)


目的:尽量减少使用read/write的调用
定义:
系统自动的在内存中为每一个正在使用的文件开辟一个缓冲区,从内存向磁盘输出数据必须先送到内存缓冲区,装满缓冲区在一起送到磁盘中去。从磁盘中读数据,则一次从磁盘文件将一批数据读入到内存缓冲区中,然后再从缓冲区逐个的将数据送到程序的数据区。
分类:全缓存,行缓存,不缓存。


缓存类型:
全缓存:当填满I/O缓存后才进行实际I/O操作(或者执行fflush、floce、exit、return),4K大小
行缓存:当填满I/O缓存后才进行实际I/O操作或者遇到新航服‘\n’(或者执行fflush、floce、exit、return),1K大小
无缓存:标准错误输出strerr


FILE *fopen(const char *path, const char *mode);
功能:打开一个文件


参数:path:打开文件的路径名
mode:
r:只读模式打开,打开的文件必须存在,否则报错
r+:读写方式打开,打开的文件必须存在,否则报错
w:以只写的方式打开文件,文件不存在则创建,文件存在则清空文件内容
w+:以读写的方式打开文件,文件不存在则创建,文件存在则清空文件内容
a:以只写的方式打开文件,文件不存在则创建,文件存在则以追加模式写。
a+:以读写的方式打开文件,文件不存在则创建,文件存在则以追加模式读写。
b:以打开二进制文件
返回值:成功返回文件指针,失败返回NULL


fopen所创建出的文件权限与umask(文件权限掩码)(取反之后,与)后得到最终的文件权限
umask 0000  =》将umask值改为0000


FILE *freopen(const char *path, const char *mode, FILE *stream);
功能:将一个流重定向到一个文件中
参数:path:目标重定向的文件路径名
mode:重定向的操作模式
stream:需要重定向的流
返回值:成功返回FILE *,失败返回NULL并且设置errno


perror和strerror函数:打印errno对应的错误信息


exit(0):进程退出函数,会释放资源将缓存区内容输出(进行善后工作)
_exit(0):进程退出函数,将资源全部清空释放


每次一个字符的IO:
int fputc(int c, FILE *stream);
功能:向一个流中写入一个字符
参数:c:写入的字符
stream:写入的流
返回值:成功返回写入的字符,失败返回EOF


int fgetc(FILE *stream);
功能:读取一个字符
参数:文件流指针
返回值:成功返回读到的字符,失败或读到文件末尾返回EOF(feof和ferror函数判断)


int fseek(FILE *stream, long offset, int whence);
功能:操作文件的读写位置指针
参数:stream:文件流指针
offset:偏移量
whence:偏移基准
SEEK_SET:以文件开头为基准
SEEK_CUR:以文件当前位置为基准
SEEK_END:以文件末尾为基准
返回值:成功返回0,失败返回-1并且设置errno


long ftell(FILE *stream);
功能:获得文件当前的偏移量
参数:文件留置针
返回值:返回文件当前的读写指针位置


void rewind(fp) = fseek(fp,0,SEEK_SET)


每次一行字符IO:
int fputs(const char *s, FILE *stream);
功能:写入一串字符串
参数:s:写入字符串的首地址
stream:文件流指针
返回值;成功返回非0,失败返回EOF


char *fgets(char *s, int size, FILE *stream);
功能:读取一行字符
参数:s:读到那里去
size:读多少(实际读size - 1个)
stream:文件流指针
返回值:成功返回保存s的首地址,失败返回NULL


int puts(const char *s);
功能:向终端输出一串字符串,结尾自动加‘\n’
参数:输出的字符串首地址
返回值:成功返回非负,失败返回EOF


gets永远不要使用,它不会检查我们申请的buf长度;


直接IO(二进制IO):
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:读取一个结构
参数:ptr:存放读取到的结构的地址
size:每个结构的大小
nmemb:结构的数量
stream:文件流指针
返回值:成功返回需要读取到的结构的数目,失败返回实际读取到的结构的数目(小于nmemb值);
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
功能:写入一个结构
参数:ptr:需要写入的结构的地址
size:每个结构的大小
nmemb:结构的数量
stream:文件流指针
返回值:成功返回需要写入的结构的数目,失败返回实际写入的结构的数目(小于nmemb值);

0 0
原创粉丝点击