fgetc和fputc
fgetc函数:
fgetc从指定的文件流中读取下一个字符。
如果文件到达结尾或发生错误,则返回EOF
fgetc通常用于读取二进制文件或文本文件。
fputc函数:
fputc将指定的字符写入到指定的文件流中。
它返回写入的字符,如果写入成功,或者在写入时发生错误,返回EOF。
fputc通常用于写入二进制文件或文本文件。
总结:fgetc用于从文件中读取字符,而fputc用于向文件中写入字符。这两个函数在处理文件时非常有用,可以单独使用或结合其他文件操作函数一起使用。
1.fputs:
该函数用于将字符串写入文件。接受两个参数,
第一个参数是要写入的字符串
第二个参数是目标文件指针
如果错误访问这个函数会返回一个非负值表示成功,或者 EOF(表示出现错误)
举个例子:
int main()
{
FILE* fp = fopen("file.txt", "w");
if (fp == NULL) {
perror("fopen");//打印错误原因
return;
}
fputs("Hello, World!", fp);
fclose(fp);
fp= NULL;
return 0;
}
2.fgets:
该函数用于从文件读取一行。fgets 也接受三个参数,
第一个参数是用于存储读取的字符串的缓冲区
第二个参数是最大读取字符数(包括空字符 \0)
第三个参数是目标文件指针。
这个函数返回 str 参数(即缓冲区),如果成功,或者 NULL(表示遇到文件结束或者出现错误)。
文件中有两行数据进行读取
int main()
{
FILE* pf = fopen("fgets.txt", "r");
if (pf == NULL)
{
perror("fopen");
return 1;
}
char arr[20] = { 0 };
fgets(arr,20, pf);
printf("%s", arr);
fgets(arr, 20, pf);
printf("%s", arr);
fclose(pf);
pf = NULL;
return 0;
}
注意:fgets在读取时最后会加上一个\0因此当数组为9个时最多读取8个
举个栗子:
假如把文件里有1~9的数字
代码读取:
int main()
{
FILE* pf = fopen("zuida.txt", "r");
if (pf == NULL)
{
perror("fopen");
return 1;
}
char arr[9] = { 0 };
fgets(arr, 9, pf);
printf("%s", arr);
fclose(pf);
pf = NULL;
return 0;
}
结果:
调试可得字符’9‘并没有被读入数组
3.fprintf
用于将格式化数据写入到指定的文件中
struct S {
int n;
float m;
char arr[];
};
int main()
{
struct S s = { 6,6.9,"zhangsan" };
FILE* pf = fopen("data.txt", "w");
if (pf == NULL)
{
perror("fopen");
return 1;
}
fprintf(pf,"%d\n%f\n%s\n", s.n, s.m, s.arr);
fclose(pf);
pf = NULL;
return 0;
}
将pf改为输出流也可以打印在屏幕上
4.fscanf
函数用于从文件中读取格式化的数据
进行读取
struct S {
int n;
float m;
char arr[200];
};
int main()
{
struct S s = {0};
FILE* pf = fopen("data.txt", "r");//读取’r'
if (pf == NULL)
{
perror("fopen");
return 1;
}
fscanf(pf,"%d %f %s", &(s.n), &(s.m), s.arr);
printf("%d %f %s\n", s.n, s.m, s.arr);
fclose(pf);
pf = NULL;
return 0;
}
sprintf
是一个在 C 语言中常用的函数,用于将格式化的数据写入字符串
用处将一个结构体转化为字符串打印
struct S {
int n;
float m;
char arr[200];
};
int main()
{
struct S s = { 100,3.3,"zhahngcsan"};
char brr[100];
sprintf(brr,"%d %f %s", s.n, s.m, s.arr);
printf("%s", brr);
return 0;
}
fwrite以二进制的方式写入数据到文件里
int main()
{
int arr[] = { 1,2,3,4,5,6 };
FILE* pf = fopen("tate.txt", "wb");
if (pf == NULL)
{
perror("fopen");
return 1;
}
fwrite(arr, sizeof(int), 6, pf);
fclose(pf);
pf = NULL;
return 0;
}
但是由于二进制记事本不能读懂
这个时候使用
fread
这个时候使用fread以二进制形式读取
int main()
{
int arr[10] = {0};
FILE* pf = fopen("tate.txt", "rb");
if (pf == NULL)
{
perror("fopen");
return 1;
}
fread(arr, sizeof(int), 6, pf);
int i = 0;
for (i = 0; i < 6; i++)
{
printf("%d", arr[i]);
}
fclose(pf);
pf = NULL;
return 0;
}
sscanf
是C语言中的一个函数,用于从字符串中读取格式化的数据。
简单代码演示
int main()
{
char str[] = "10,3.14";
int a;
float b;
sscanf(str, "%d,%f", &a, &b);
printf("%d %f\n", a, b);
return 0;
}
sscanf和sprintf代码演示
struct S {
int n;
float m;
char arr[200];
};
int main()
{
struct S s = { 100,3.3333,"zhahngcsan"};//结构体赋值
char brr[100];
sprintf(brr,"%d %f %s", s.n, s.m, s.arr);//将结构体中的数据转换为字符串
printf("%s\n", brr);//打印转化的字符串
struct S t = { 0 };
sscanf(brr, "%d %f %s", &(t.n), &(t.m), &(t.arr));//再将字符串提取到一个新的结构体中打印
printf("%d%f%s",t.n,t.m,t.arr);
return 0;
}
对比
scanf-针对标准输入流(stdin) 的格式化输入函数
printf -针对标准输出流(stdout) 的格式化输出函数
fscanf -针对所有输入流的格式化输入函数
fprintf-针对所有输出流的格式化输出函数
sscanf-从字符中读取格式化的数据
sprintf-把格式化的数据转换成字符串