1.文件的顺序读写
相关函数:
1.1 fputc函数
fputc的参数如下
它的功能是把字符character输出到stream指向的文件中,字符的本质就是它的ascll值所以这里用int类型接收。如果写入成功则返回写入的字符的ascll码,失败则返回-1(即EOF)
示例代码:
#include<stdio.h>
#include<errno.h>
int main()
{
FILE* pf = fopen("test.txt", "w");
if (pf == NULL)
{
perror(fopen);
return 1;
}
for (char i = 'a'; i <= 'z'; i++)
{
fputc(i, pf);
}
fclose(pf);
return 0;
}
注意:当不存在test.txt这个文件的时候,以写的形式打开(即"w")程序执行后会创建一个test.txt文件,但如果以读的形式打开(即"r")的话程序会报错 。
注意:如果test.txt这个文件存在的时候,以写的形式打开(即"w")程序执行后会把原有的数据清空再进行写入。
注意:不能以读的形式打开然后去写,也不能以写的形式打开然后去读。
一下方式可以找到这个被读写文件
1.2 fputs函数
fputs参数如下:
fputs的功能是把字符串str输出到stream指向的文件中,如果写入成功返回一个非负整数,写入失败,则返回-1(即EOF)。
示例代码:
int main()
{
FILE* pf = fopen("test.txt", "w");
if (pf == NULL)
{
perror(fopen);
return 1;
}
fputs("1234567", pf);
char s[] = "abcdef";
fputs(s, pf);
fclose(pf);
return 0;
}
1.3 fgetc函数
fgetc的参数如下:
它的作用是返回stream对应的文件里面的一个字符(它的返回值),所以需要一个字符变量来接收,当读取失败时返回-1,虽然说是返回字符,但fgetc函数的返回类型是int,不过这没关系每个字符都有对应的ascll码值,它的ascll是int类型,这里返回类型用int接收也是为了对应当读取失败时返回的-1,每读取一次stream指向的文件内容,文件指针往后移动一位。
示例代码
#include<stdio.h>
int main()
{
FILE* pf = fopen("test.txt", "r");
if (!pf)
{
perror(fopen);
return 1;
}
char c;
while ((c = fgetc(pf))!=-1)
{
printf("%c", c);
}
fclose(pf);
return 0;
}
1.4 fgets函数
fgets参数如下:
fgets函数的功能是把stream指向的文件中的num个字符(即一个字符串)输入到str中,返回值是该字符串首字符的地址,当读取失败时返回NULL,每读取一次stream指向的文件内容,stream往后移动num位。
#include<stdio.h>
int main()
{
FILE* pf = fopen("test.txt", "r");
if (pf == NULL)
{
perror(fopen);
return 1;
}
char s[30] = { 0 };
while(fgets(s,2,pf)!=NULL)
{
printf(s);
}
return 0;
}
1.5 fprintf函数
参数如下:
它的功能是把数据以格式化的形式输出到stream指向的文件
示例代码
#include<stdio.h>
#include<errno.h>
int main()
{
FILE* pf = fopen("test.txt", "w");
if (pf == NULL)
{
perror(fopen);
return 1;
}
int a = 6;
char s[10] = "pupm";
fprintf(pf, "%d %s", a, s);
fclose(pf);
return 0;
}
1.6 fscanf函数
参数如下:
它的作用是把stream指向的文件的内容格式化的输入到内存中。
示例代码
#include<stdio.h>
#include<errno.h>
int main()
{
FILE* pf = fopen("test.txt", "r");
if (pf == NULL)
{
perror(fopen);
return 1;
}
int a = 0;
char s[10] = {0};
fscanf(pf,"%d %s", &a, s);
printf("%d %s", a,s);
fclose(pf);
return 0;
}
1.7 fwrite
fwrite的功能是把ptr指向的空间中的count个元素以二进制的形式写入stream所指向的文件中,其中参数size表示ptr指向的空间中的一个元素占的字节数,返回成功写入的元素个数
注意:文件要以"wb"的形式打开,表示以二进制形式写入。
示例代码
int main()
{
FILE* pf = fopen("test.txt", "wb");
if (pf == NULL)
{
perror(fopen);
return 1;
}
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
fwrite(arr, sizeof(arr[0]), 8, pf);
fclose(pf);
return 0;
}
因为是以二进制的形式写进去的,所以里面的内容是看不懂的
1.8 fread
参数如下:
与fwrite函数相反该函数的功能是把stream所指向的文件内容的count个元素以二进制的形式读取到ptr所指向的空间,其中参数size表示ptr指向的空间中的一个元素占的字节数,返回成功读取到的元素个数
注意:文件要以"rb"的形式打开,表示以二进制形式读取。
示例代码
int main()
{
FILE* pf = fopen("test.txt", "rb");
if (pf == NULL)
{
perror(fopen);
return 1;
}
int arr[10] = { 0 };
int i = 0;
while (fread(&arr[i], sizeof(arr[0]), 1, pf) == 1)
{
printf("%d ", arr[i++]);
}
fclose(pf);
return 0;
}
2.sprintf函数
参数如下:
功能是把格式的数据写入字符串str中
示例代码
#include<stdio.h>
int main()
{
char s[10] = { 0 };
int a = 42;
char c='a';
sprintf(s, "%d %c", a, c);
printf("%s", s);
return 0;
}
3.sscanf函数
sscanf的功能是在字符串s中数据以格式化的形式读取。
示例代码
#include<stdio.h>
int main()
{
char s[10] = "4k";
int a;
char c;
sscanf(s, "%d%c", &a, &c);
printf("%d %c", a, c);
return 0;
}
4.文件的随机读写:
相关函数
fseek 根据⽂件指针的位置和偏移量来定位⽂件指针
ftell 返回⽂件指针相对于起始位置的偏移量
rewind 让⽂件指针的位置回到⽂件的起始位置
4.1 fseek函数
该函数的作用是把文件指针stream指向距origin(起始位置)偏移量为offset的位置
origin有3中选择:SEEK_SET,SEEK_CUR,SEEK_END三种
示例代码
int main()
{
FILE* pf = fopen("test.txt", "r");
if (pf == NULL)
{
perror(fopen);
return 0;
}
char a, b, c;
fseek(pf, 5, SEEK_SET);
a = fgetc(pf);
printf("%c ", a);
fseek(pf, 2, SEEK_CUR);
b = fgetc(pf);
printf("%c ", b);
fseek(pf, -2, SEEK_END);
c = fgetc(pf);
printf("%c ", c);
fclose(pf);
return 0;
}
test.txt文件内容
运行结果:
4.2 ftell函数
功能是返回文件指针相对于文件起始位置的偏移量。
示例代码
int main()
{
FILE* pf = fopen("test.txt", "r");
if (pf == NULL)
{
perror(fopen);
return 0;
}
fseek(pf, -1, SEEK_END);
int ret = ftell(pf);
printf("%d", ret);
fclose(pf);
return 0;
}
4.3 rewind函数
这个函数功能是让文件指针回到文件的起始位置
示例代码
int main()
{
FILE* pf = fopen("test.txt", "r");
if (pf == NULL)
{
perror(fopen);
return 0;
}
fseek(pf, -1, SEEK_END);
printf("%c ", fgetc(pf));
rewind(pf);
printf("%c ", fgetc(pf));
fclose(pf);
return 0;
}
5.错误检测
为什么要有错误检查呢
fgetc 如果读取正常,返回的是读取到字符的ascIl码值,如果读取的过程中遇到文件末尾,或者发生错误,都返回EOF(-1)。
fgets如果读取正常,返回的是存储读取到的字符串的字符数组的地址,如果读取的过程中遇到文件末尾,或者发生错误,都返回NULL。
所以我们是无法知道是因为什么原因文件读取结束的。
5.1 feof函数
该函数用于判断当⽂件读取结束的时候,判断是读取结束的原因是否是:遇到⽂件尾结束(即是否是正常结束)
当是因为遇到⽂件尾而读取结束时返回非0值,否则返回0
5.2 ferror函数
该函数判断读取文件的时候是否发生错误。
读取文件的过程发生错误返回0,否则返回非0值。
示例代码
#include<stdio.h>
#include<errno.h>
int main()
{
FILE* pf = fopen("test.txt", "r");
if (pf == NULL)
{
perror(fopen);
return 1;
}
char c;
while ((c = fgetc(pf)) != EOF)
{
printf("%c", c);
}
if (feof(pf))
{
printf("\n遇到文件末尾,读取正常结束\n");
}
else if (ferror(pf))
{
perror(fgetc);
}
fclose(pf);
return 0;
}