1、fopen()函数
调用fopen()函数可以打开或创建一个文件。
#include <stdio.h>
FILE *fopen(const char *path, const char *mode);
path
:
参数
path
指向文件路径,可以是绝对路径、也可以是相对路径。
mode
:
参数
mode
指定了对该文件的读写权限,是一个字符串。
返回值:
调用成功返回一个指向
FILE
类型对象的指针(
FILE *
),该指针与打开或创建的文件相关联, 后续的标准 I/O
操作将围绕
FILE
指针进行。如果失败则返回
NULL
,并设置
errno 以指示错误原因。
2、fclose()函数
2、fclose()函数
调用 fclose()库函数可以关闭一个由
fopen()
打开的文件。
#include <stdio.h>
int fclose(FILE *stream);
参数
stream
为
FILE
类型指针,调用成功返回
0
;失败将返回
EOF
(也就是
-1
),并且会设置 errno 来指示错误原因。
3、fread()
3、fread()
当使用
fopen()
库函数打开文件之后,我们便可以使用
fread()
库函数对文件进行读操作
#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
ptr:fread()将读取到的数据存放在参数 ptr 指向的缓冲区中;
size:fread()从文件读取 nmemb 个数据项,每一个数据项的大小为 size 个字节,所以总共读取的数据大小为 nmemb * size 个字节。
nmemb:参数 nmemb 指定了读取数据项的个数。
stream:FILE 指针。
返回值:调用成功时返回读取到的数据项的数目(数据项数目并不等于实际读取的字节数,除非参数 size 等于 1);如果发生错误或到达文件末尾,则 fread()返回的值将小于参数 nmemb,那么到底发生了错误 还是到达了文件末尾,fread()不能区分文件结尾和错误,究竟是哪一种情况,此时可以使用 ferror()或 feof() 函数来判断。
4、fwrite()
#include <stdio.h>
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
ptr
:
将参数
ptr
指向的缓冲区中的数据写入到文件中。
size
:
参数
size
指定了每个数据项的字节大小,与
fread()
函数的
size
参数意义相同。
nmemb
:
参数
nmemb
指定了写入的数据项个数,与
fread()
函数的
nmemb
参数意义相同。
stream
:
FILE
指针。
返回值:
调用成功时返回写入的数据项的数目(数据项数目并不等于实际写入的字节数,除非参数
size 等于 1
);如果发生错误,则
fwrite()
返回的值将小于参数
nmemb
(或者等于
0
)。
示例代码:标准 I/O 之 fwrite()写文件
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char buf[] = "Hello World!\n";
FILE *fp = NULL;
/* 打开文件 */
if (NULL == (fp = fopen("./test_file", "w")))
{
perror("fopen error");
exit(-1);
}
printf("文件打开成功!\n");
/* 写入数据 */
if (sizeof(buf) > fwrite(buf, 1, sizeof(buf), fp))
{
printf("fwrite error\n");
fclose(fp);
exit(-1);
}
printf("数据写入成功!\n");
/* 关闭文件 */
fclose(fp);
exit(0);
}
首先使用 fopen()函数将当前目录下的 test_file 文件打开,调用 fopen()时 mode 参数设置为"w",表示以只写的方式打开文件,并将文件的长度截断为 0,如果指定文件不存在则创建该文件。打开文件之后调用fwrite()函数将"Hello World!"字符串数据写入到文件中。
编译测试:
示例代码:标准 I/O 之 fread()读文件
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char buf[50] = {0};
FILE *fp = NULL;
int size;
/* 打开文件 */
if (NULL == (fp = fopen("./test_file", "r")))
{
perror("fopen error");
exit(-1);
}
printf("文件打开成功!\n");
/* 读取数据 */
if (12 > (size = fread(buf, 1, 12, fp)))
{
if (ferror(fp))
{ //使用 ferror 判断是否是发生错误
printf("fread error\n");
fclose(fp);
exit(-1);
}
/* 如果未发生错误则意味着已经到达了文件末尾 */
}
printf("成功读取%d 个字节数据: %s\n", size, buf);
/* 关闭文件 */
fclose(fp);
exit(0);
}
首先同样使用
fopen()
打开当前目录下的
test_file
文件得到
FILE
指针,调用
fopen()
时其参数
mode
设置 为"r"
,表示以只读方式打开文件。 接着使用 fread()
函数从文件中读取
12 * 1=12
个字节的数据,将读取到的数据存放在
buf
中,当读取到的字节数小于指定字节数时,表示发生了错误或者已经到达了文件末尾,程序中调用了库函数 ferror()
来判断是不是发生了错误。如果未发生错误,那么就意味着已经达到了文件末尾, 其实也就说明了在调用 fread()
读文件时对应的读写位置到文件末尾之间的字节数小于指定的字节数。
编译测试: