标准库的IO接口:
#include <stdio.h>
FILE *fopen(const char *path, const char *mode);
返回值: 成功将返回一个指向文件对象FILE的指针.否则,将返回 NULL
fopen打开文件名为path指向的字符串的文件,将一个流与它关联
参数mode指向一个字符串,以下列序列之一开始(序列之后可以有附加的字符):
r 用于只读,流被定位于文件的开始
r+ 用于读写,流被定位于文件的开始
w 用于只写,流被定位于文件的开始
w+ 用于读写,如果文件不存在就创建它.否则将截断它,流被定位于文件的开始
a 用于追加(在文件尾写).如果文件不存在就创建它,流被定位于文件的末尾
a+ 用于追加(在文件尾写).如果文件不存在就创建它,读文件的初始位置是文件的开始,但是输出总是被追加到文件的末尾
r+的读写和w+的读写有什么区别:
r+ 打开文件用于读写, 若文件不存在则报错
w+ 打开文件用于读写, 若文件不存在则创建, 文件存在则清空原有内容
b 如果不指定b, 则认为文件是文本操作, 加上b则认为是二进制操作, 区别在于:
有时候一个特殊字符, 只是一个字符但是占据两个字节的内存(读取一个100字节大小的文件, 文本操作最终读取出来的数据, 不一定是100字节)
size_t fread(void* buffer, size_t size, size_t count, FILE* stream);
buffer: 指向缓冲区读取的数据或者是用于接收数据的内存地址
size: 数据块大小
count: 数据块个数
stream: 读取的文件流指针
--------------------------------------------------------------------
size_t fwrite(void* buffer, size_ size, size_t count, FILE* stream);
buffer: 指向缓冲区读取的数据或者是用于接收数据的内存地址
size: 数据块大小
count: 数据块个数
stream: 写入的文件流指针
注意: fread/fwrite操作的数据实际大小是数据块大小*数据块个数
返回值:返回实际操作的数据块个数
例如: 读取一个文件 size = 10, count = 2;
如果文件大小足够则返回2;但是若文件大小不足20字节, 则会返回1, 因为第二块没有读满
fread如果读到了文件末尾会返回0, 若要读取1000个字节, 数据块个数(count)为1, 数据块大小(size)只有512字节, 虽然读了512字节也会返回0
fread/ fwrite比较推荐数据块大小为1, 数据块个数是想要操作的数据大小
int fseek(FILE *stream, long offset, int whence);
将文件的读写指针从whence位置偏移offset个字节----跳转文件读写位置
fseek()为stream指向的流设置文件位置指示符.
跳转位置(以字节为单位)是通过将偏移字节加到地点指定的位置.
如果将whence设置为SEEK_SET,SEEK_CUR或SEEK_END,则偏移量是相对于文件的开头,当前位置或文件末尾
----------------------------------------------------------------------------------
int fclose(FILE *stream);
关闭文件流指针,释放资源
fseek函数对于文件没有数据也可以跳转读写位置
对文件数据进行字符串操作的时候要注意文件数据中的’\0’ , 打开文件一定不要忘了关闭文件
下面写一个程序, 熟悉一下它们的用法:
#include<stdio.h>
#include<string.h>
int main()
{
FILE* fp = NULL;
fp = fopen("./test.txt", "w+"); //w+文件不存在则创建,存在则清空内容
if(fp == NULL)
{
perror("fopen error"); //打印上一个系统调用接口的使用错误原因
return -1;
}
//fseek跳转读写位置
//SEEK_SET --从文件起始偏移
//SEEK_CUR --从当前读写位置偏移
//SEEK_END --从文件末尾偏移
fseek(fp, 0, SEEK_END); //将文件的读写位置偏移到末尾
char buf[] = "Hello World!\n";
int ret = fwrite(buf, strlen(buf), 1, fp);
if(ret == 0)
{
perror("fwrite error");
return -1;
}
fseek(fp, 0, SEEK_SET);
char tmp[1024] = {0};
ret = fread(tmp, 1, 1023, fp); //在块大小为1的情况下不会出现读到数据依然返回0的情况
if(ret == 0)
{
printf("have no data or error\n");
}
printf("ret:%d-[%s]\n", ret, tmp);
fclose(fp);
return 0;
}
运行结果:
在运行程序前, 我的目录下原来没有test.txt文件; 程序运行后, 可以看到当前目录下自动创建了一个test.txt文件, 并且写入内容: