顺序读写函数介绍
函数名 | 功能 | 适用于 |
---|---|---|
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;
}