顺序读写函数介绍
| 函数名 | 功能 | 适用于 |
|---|---|---|
| fgetc | 字符输入函数 | 所有输入流 |
| fputc | 字符输出函数 | 所有输出流 |
| fgets | 文本行输入函数 | 所有输入流 |
| fputs | 文本行输出函数 | 所有输出流 |
| fscanf | 格式化输入函数 | 所有输入流 |
| fprintf | 格式化输出函数 | 所有输出流 |
| fread | 二进制输入 | 文件 |
| fwrite | 二进制输出 | 文件 |
上面说的适用于所有输入流⼀般指适用于标准输入流和其他输入流(如文件输入流);所有输出流⼀般指适用于标准输出流和其他输出流(如文件输出流)。
顺序读写函数的函数参数
fgetc函数参数

使用fgetc函数从标准输入流中读取数据
fgetc函数在读取失败的时候会返回EOF
如果流已经在文件末尾的时候调用fgetc函数,fgetc函数会返回一个EOF,同时设置一个状态值说明现在已经遇到文件末尾了。
执行代码前,先创建记事本并更名为:data.txt,并写入信息:

下面我们看一段代码学习fgetc函数的使用:
int main()
{
FILE* pf = fopen("data.txt", "r");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//读文件
int ch = fgetc(pf);
printf("%c\n", ch);
fclose(pf);
pf = NULL;
return 0;
}
代码结果如图:

fputc函数参数

第一个参数:要写的字符,第二个参数:要写入文件的指针
下面我们看一段代码学习fputc函数的使用:
int main()
{
FILE* pf = fopen("test.txt", "w");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//写文件
char ch = 'a';
for (; ch <= 'z'; ch++)
{
fputc(ch, pf);
}
fclose(pf);
pf = NULL;
return 0;
}
执行完代码我们打开对应文件,可以发现字符已经成功写入:

fgets函数参数

fgets函数:最多读取num个字符放在str里面
如果遇到文件末尾或者读取失败都会返回空指针
执行代码前,先创建记事本并更名为:data.txt,并写入信息:

下面我们看一段代码学习fgets函数的使用:
int main()
{
FILE* pf = fopen("data.txt", "r");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//读文件
char arr[20] = "xxxxxxxxxxxxxxxx";
fgets(arr,20,pf);
printf("%s\n", arr);
fclose(pf);
pf = NULL;
return 0;
}
代码结果如图:

fputs函数参数

第一个参数:要写入的字符信息;第二个参数:要写入的流
下面我们看一段代码学习fputs函数的使用:
int main()
{
FILE* pf = fopen("data.txt", "w");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//写文件
fputs("qasfsaas", pf);
fclose(pf);
pf = NULL;
return 0;
}
代码执行完毕,打开对应记事本,对应的信息已经成功写入。

fscanf函数参数

下面我们看一段代码学习fscanf函数的使用:
struct S
{
int n;
float f;
char arr[20];
};
int main()
{
struct S s = { 100,3.14f,"zhangsan" };
FILE* pf = fopen("data.txt", "r");
if (pf == NULL)
{
perror("fopen");
return 1;
}
fscanf(pf,"%d %f %s", &(s.n), &(s.f), s.arr);
printf("%d %f %s", s.n, s.f, s.arr);
fclose(pf);
pf = NULL;
return 0;
}
代码结果如图:

fprintf函数参数

下面我们看一段代码学习fprintf函数的使用:
struct S
{
int n;
float f;
char arr[20];
};
int main()
{
struct S s = { 100,3.14f,"zhangsan" };
FILE* pf = fopen("data.txt", "w");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//写文件
fprintf(pf, "%d %f %s", s.n, s.f, s.arr);
fclose(pf);
pf = NULL;
return 0;
}
代码执行完毕,打开对应记事本,对应的信息已经成功写入。

fwrite函数参数

下面我们看一段代码学习fwrite函数的使用:
int main()
{
int arr[10] = { 1,2,3,4,5,6,7 };
FILE* pf = fopen("data.txt", "wb");
if (pf == NULL)
{
perror("fopen");
return 1;
}
fwrite(arr, sizeof(int), 7, pf);
fclose(pf);
pf = NULL;
return 0;
}
代码执行完毕,打开对应记事本,发现是一段乱码。因为记事本无法识别二进制信息,我们可以使用fread函数验证。

fread函数参数

下面我们看一段代码学习fread函数的使用:
int main()
{
int arr[10] = { 1,2,3,4,5,6,7 };
FILE* pf = fopen("data.txt", "rb");
if (pf == NULL)
{
perror("fopen");
return 1;
}
fread(arr, sizeof(int), 7, pf);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d\n", arr[i]);
}
fclose(pf);
pf = NULL;
return 0;
}
代码结果如图:

我们发现打印出的信息和我们写入一致,故结果正确。
sscanf、sprintf函数参数


sscanf 功能:从字符中读取格式化的数据
sprintf 功能:将格式化的数据,转换成一个字符串
下面我们看一段代码学习sscanf、sprintf函数的使用:
struct S
{
int n;
float f;
char arr[20];
};
int main()
{
struct S s = { 100,3.14f,"zhangsan" };
char arr[30] = { 0 };
//把格式化的数据转换成字符串
sprintf(arr, "%d %f %s", s.n, s.f, s.arr);
printf("%s\n", arr);
//从arr这个字符串中提取出格式化的数据
struct S t = { 0 };
sscanf(arr, "%d %f %s", &(t.n), &(t.f), t.arr);
printf(arr, "%d %f %s", t.n, t.f, t.arr);
return 0;
}



















