文章目录
1、fopen()
用于打开或创建文件,在打开或创建文件时可以指定文件的属性及用户的权限等各种参数
函数声明:
#include <stdio.h>
FILE *fopen(const char *__restrict__ __filename, const char *__restrict__ __modes)
- restrict __filename : 字符串,表示要打开的文件名称。
- restrict __modes :字符串,表示文件的访问模式,具体如下所示:
“r” 打开一个用于读取的文件。该文件必须存在。
“w” 创建一个用于写入的空文件。如果文件名称与已存在的文件相同,则会删除已有文件的内容,文件被视为一个新的空文件。
“a” 追加到一个文件。写操作向文件末尾追加数据。如果文件不存在,则创建文件。
“r+” 打开一个用于更新的文件,可读取也可写入。该文件必须存在。
“w+” 创建一个用于读写的空文件。
“a+” 打开一个用于读取和追加的文件。
函数返回值:
该函数返回一个 FILE 指针。否则返回 NULL,且设置全局变量 errno 来标识错误。
实例1:
uint8_t text_file() {
/*
"w" 创建一个用于写入的空文件。如果文件名称与已存在的文件相同,
则会删除已有文件的内容,文件被视为一个新的空文件。
*/
FILE* fp;
fp = fopen("file.txt", "w+");
if (!fp) {
puts("Fail to open file!");
}
fprintf(fp, "%s %s %s %d", "We", "are", "in", 2022);
fclose(fp);
return 0;
}
结果:
实例2:
uint8_t text_file_add() {
/*
a+ :打开一个用于读取和追加的文件。
*/
FILE* fp;
fp = fopen("file.txt", "a+");
if (!fp) {
puts("Fail to open file!");
}
fprintf(fp, " %s", "new world");
fclose(fp);
return 0;
}
结果:
2、fread()
用于从文件中读入一定大小数据到指定的地址中。
函数原型
size_t fread(void *__restrict____ptr, size_t __size, size_t__n, FILE *__restrict__ __stream)
- __restrict____ptr :这是指向带有最小尺寸 size*nmemb 字节的内存块的指针。
- size_t __size :这是要读取的每个元素的大小,以字节为单位。
- size_t__n :这是元素的个数,每个元素的大小为 size 字节。
- restrict __stream: 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输入流。
函数返回值
成功读取的元素总数会以 size_t 对象返回,size_t 对象是一个整型数据类型。如果总数与 nmemb 参数不同,则可能发生了一个错误或者到达了文件末尾。
实例 1:
uint8_t text_file_fread() {
FILE* fp;
char c[] = "We are in 2022 new world";
char buffer[30];
/* 打开文件用于读写 */
fp = fopen("file.txt", "w+");
/* 写入数据到文件 */
fwrite(c, sizeof(c), 1, fp);
/* 查找文件的开头 */
fseek(fp, 0, SEEK_SET);
/* 读取并显示数据 */
fread(buffer, sizeof(c), 1, fp);
printf("%s\n", buffer);
fclose(fp);
return 0;
}
结果:
3、fwrite()
函数声明
往文件里面写信息
size_t fwrite(const void *__restrict____ptr, size_t __size, size_t __n, FILE *__restrict____s)
- __restrict____ptr :这是指向要被写入的元素数组的指针。
- size_t __size :这是要被写入的每个元素的大小,以字节为单位。
- size_t __n :这是元素的个数,每个元素的大小为 size 字节。
- __restrict____s :这是指向 FILE 对象的指针,该 FILE 对象指定了一个输出流。
函数返回值
如果成功,该函数返回一个 size_t 对象,表示元素的总数,该对象是一个整型数据类型。如果该数字与 nmemb 参数不同,则会显示一个错误。
实例1:
uint8_t text_file_fwrite() {
FILE* fp;
char str[55];
memset(str,'B',55);
fp = fopen("file.txt", "w");
fwrite(str,sizeof(char), sizeof(str)/sizeof(char), fp);
fclose(fp);
return 0;
}
结果
实例 2
uint8_t text_file_fwrite() {
FILE* fp;
char str[] = "we are in 2060";
fp = fopen("file.txt", "w");
fwrite(str,sizeof(char), sizeof(str)/sizeof(char)-1, fp);
fclose(fp);
return 0;
}
结果
注意
如果:
fwrite(str,sizeof(char), sizeof(str)/sizeof(char), fp);
结果:
4、fseek()
实现偏移
函数原型:
int fseek(FILE *c, long __off, int __whence)
- __stream:这是指向 FILE 对象的指针,该 FILE 对象标识了流。
- __off:这是相对 whence 的偏移量,以字节为单位。
- __whence:这是表示开始添加偏移 offset 的位置。它一般指定为下列常量之一
SEEK_SET 文件的开头
SEEK_CUR 文件指针的当前位置
SEEK_END 文件的末尾
函数返回值:
如果成功,则该函数返回零,否则返回非零值。
实例:
uint8_t text_file_fseek() {
FILE* fp;
fp = fopen("file.txt", "w+");
fputs("we are in 2060", fp);
fseek(fp, 7, SEEK_SET); // 根据偏移掺入数据
fputs("where are you from ?", fp);
fclose(fp);
return 0;
}
结果:
5、ftell()
函数原型:
long ftell(FILE *__stream)
- __stream:这是指向 FILE 对象的指针,该 FILE 对象标识了流。
函数返回值:
该函数返回位置标识符的当前值。如果发生错误,则返回 -1L,全局变量 errno 被设置为一个正值。
实例:
uint8_t text_file_ftell() {
FILE* fp;
int len;
fp = fopen("file.txt", "r");
if (fp == NULL) {
perror("打开文件错误");
return (-1);
}
fseek(fp, 0, SEEK_END);
len = ftell(fp);
fclose(fp);
printf("file.txt 的总大小 = %d 字节\n", len);
return 0;
}
结果:
6、fclose()
函数原型:
int fclose(FILE *__stream)
- __stream:这是指向 FILE 对象的指针,该 FILE 对象标识了流。
函数返回值:
如果流成功关闭,则该方法返回零。如果失败,则返回 EOF。
实例:
前面每一个例子都要用到
参考:
1、C语言fopen函数的用法,C语言打开文件详解
2、fopen 菜鸟
3、fread 菜鸟
4、fwrite 菜鸟
5、fseek 菜鸟
6、ftell 菜鸟
7、fclose 菜鸟
本文含有隐藏内容,请 开通VIP 后查看