1、文件读写前,必须先使用fopen函数打开文件。
fopen
若要对文件进行读写操作,第一步需要使用fopen()函数fopen()函数用于打开指定路径的文件,获取指向该文件的指针
函数原型:
/** @func: fopen
* @brief: 打开文件
* @para: [path]:文件路径,如:"E:\Test\test.txt"
* [mode]:文件打开方式(r w a r+ w+ a+ rb wb ab ...具体见下面表格)
* @return:文件打开成功,则指向该流的文件指针就会被返回
* 文件打开失败,则返回NULL,并把错误代码存在errno中
FILE * fopen(const char * path,const char * mode);
r read 只读(打开文件),文件必须存在
w write 只写(创建文件),文件若已存在,则文件会先被清空
a append 末尾追加写入,文件若不存在,则先创建
疑问1:r+与w+的作用有区别吗?
r表示读,w表示写,都补充一个+,表示既能读也能写,看起来作用好像是一样但,区别就在于第1部分的r与w,一个是文件必须存在,一个是不存在则会先创建
疑问2:w与w+的作用有区别吗?a与a+的作用有区别吗?
w表示擦除写入,a表示追加写入,都补充一个+,赋予它们读的功能
w和a既然都能写了,还不能读吗,还要添加一个+才能读?
2、fread
函数原型:
/** @func: fread
* @brief: 从文件读取
* @para: [buffer]:指向数据块的指针
* [size]:每个数据的大小,单位为Byte(例如:sizeof(int)就是4)
* [count]:数据个数
* [stream]:文件指针,如fp
* @return:实际读取的个数
size_t fread(void *buffer, size_t size, size_t count, FILE *stream);
fread的返回值随着调用格式的不同而不同:
调用格式1:fread(buf,sizeof(buf),1,fp);,将整个buf数据作为1个数据读取,则读取的个数是1读取成功返回值为1
调用格式2:fread(buf,1,sizeof(buf),fp);,将1Byte作为1个数据读取,则读取个数是sizeof(buf)读取成功返回实际写入的数据个数(单位为Byte)
3、fwrite(写入的需要是字符串指针,整型指针容易乱码)
fwrite()函数用于将内存区域中的数据写入到本地文本
函数原型:
/** @func: fwrite
* @brief: 向文件写入
* @para: [buffer]:指向数据块的指针
* [size]:每个数据的大小,单位为Byte(例如:sizeof(int)就是4)
* [count]:数据个数
* [stream]:文件指针,如fp
* @return:实际写入的个数
size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);
fwrite的返回值随着调用格式的不同而不同:
调用格式1:fwrite(buf,sizeof(buf),1,fp);,将整个buf数据作为1个数据写入,则写入个数是1
成功写入返回值为1
调用格式2:fwrite(buf,1,sizeof(buf),fp);,将1Byte作为1个数据写入,则写入个数是sizeof(buf)
成功写入则返回实际写入的数据个数(单位为Byte)
fclose
写完数据后要调用fclose()关闭流,不关闭流的情况下,每次读或写数据后,文件指针都会指向下一个待写或者读数据位置的指针。
通过此函数将整型转化为字符型。此函数调用方式为int sprintf(char *string,char *format,arg_list);
说明: 函数sprintf()的用法和printf()函数一样,只是sprintf()函数给出第一个参数string(一般为字符数组)