文章内容
顺序读写的函数解读
一:字符输入输出函数
1. fputc
函数功能:将字符写入流(函数调用一次,使用一个字符)
函数原型:
int fputc ( int character, FILE * stream );
- character:要写入的字符的int提升。
写入时,该值在内部转换为无符号字符 - FILE * stream:指向标识输出流的FILE对象的指针(就是所使用的文件指针)
#include <stdio.h>
int main()
{
//打开文件
//"w"表示如果没有该文件 创建一个文件
FILE* pf = fopen("test.txt", "w");
//判断是否创建成功
if (pf == NULL)
{
perror("fopen:");
return;
}
//写文件
fputc('c', pf);
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
运行结果
创建出的文件和输到文件里面的数据
fgetc 和 fputc 使用了一次都会改变文件指针指向的位置,都是向后移动一个单位
2.fgetc
函数功能:从流中获取字符(函数调用一次,使用一个字符)
函数原型:int fgetc ( FILE * stream );
FILE * stream:指向标识输入流的FILE对象的指针(就是所使用的文件指针)
int main()
{
//打开文件
//r代表只读文件,
//如果没有该文件,则会打开失败
FILE* pf = fopen("test.txt", "r");
//判断文件是否打开成功
if (pf == NULL)
{
perror("fopen");
return;
}
//读文件
//因为fgetc会返回 int
//可以使用链式访问
printf("%d\n", fgetc(pf));
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
目标文件:
运行结果
打印99的原因是 ‘c’ 的ASCII值为99
注: 在 cpluscplus.com 网站中对 fgetc返回值的描述:
成功时,函数返回字符(并将其提升为int值)
原因是,用来适应特殊值EOF来表示失败
通过这种描述,当文件数据过多时,就有优化代码的思路
#include <stdio.h>
int main()
{
//打开文件
FILE* pf = fopen("test.txt", "r");
//判断是否打开成功
if (pf == NULL)
{
perror("fopen:");
return;
}
//读文件
int c = 0;
while ((c = fgetc(pf)) != EOF)//当返回值正确时进入循环
{
//这里使用 %c 就可以打印字符型
printf("%c", c);
}
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
文件内容
运行结果
二:文本行输入输出函数
1.fputs
函数功能:写一个字符串到流中,一行一行的写入
函数原型:
int fputs ( const char * str, FILE * stream )
str : 包含要写入流的内容的字符串
stream : 指向标识输出流的FILE对象的指针(文件指针)
#include <stdio.h>
int main()
{
//定义一个字符串数组
char str[] = "abcedfghi";
//打开文件
FILE* pf = fopen("test.txt", "w");
//判断是否打开失败
if (pf == NULL)
{
perror("fopen");
return;
}
//写文件
fputs(str, pf);
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
运行结果
2.fgets
函数功能 : 从流中得到一个字符串
函数原型 : char * fgets ( char * str, int num, FILE * stream )
str : 指向复制读取字符串的字符数组的指针
num : 要复制到str中的最大字符数(包括终止的空字符)
stream : 指向标识输入流的FILE对象的指针(文件指针)
#include <stdio.h>
int main()
{
//创建一个字符串来接收
char str[20] = { 0 };
//打开文件
FILE* pf = fopen("test.txt", "r");
//判断是否打开失败
if (pf == NULL)
{
perror("fopen");
return;
}
//读文件
fgets(str, 7, pf);
printf("%s\n", str);
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
目标文件:
运行结果
上述两图可以发现,应该拷贝 7 个字符,但最后只有 6 个字符, 其中的原因是应该拷贝的最后一个字符 ‘g’ 被改变成 ‘\0’ 。
所以在使用时, 需要注意这点。
三:格式化输入输出函数
1. fprintf
函数功能 : 将格式化数据写入流(写文件指针)
函数原型 : int fprintf ( FILE * stream, const char * format, … )
这时,我们可以类似 printf 的函数原型
int printf ( const char * format, … )
就会发现 fprintf函数 比 printf函数的参数多了个文件指针,其余不变。
因为fprintf不像前面几个函数,只能用字符,所以这里用结构体来举例
#include <stdio.h>
struct S
{
char name[20];
int age;
float score;
};
int main()
{
struct S s = { "lisi", 20, 90.0 };
//打开文件
FILE* pf = fopen("test.txt", "w");
//判断是否打开成功
if (pf == NULL)
{
perror("fopen");
return;
}
//写文件
fprintf(pf, "%s %d %.1f", s.name, s.age, s.score);
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
运行结果
2.fscanf
函数功能 : 从流中读取格式化数据
函数原型 : int fscanf ( FILE * stream, const char * format, … )
参数和fprintf大同小异,也和fgets一样需要定义一个变量来接收读取到数据
#include<stdio.h>
struct S
{
char name[20];
int age;
float score;
};
int main()
{
struct S s = { 0 };
//打开文件
FILE* pf = fopen("test.txt", "r");
//判断是否打开失败
if (pf == NULL)
{
perror("fopen");
return;
}
//读文件
fscanf(pf, "%s %d %f", s.name, &(s.age), &(s.score));
printf("%s %d %.1f", s.name, s.age, s.score);
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
目标文件
运行结果
四:二进制输入输出函数
1.fwirte
函数功能 : 将数据块写入流
函数原型 : size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream )
ptr : 指向要写入的元素数组的指针,转换为常量void*
size : 元素的大小
count : 元素的个数
stream : 流
注 fopen中的 打开方式要改为 " xb"的形式(x可以为 r,w,a)。
#include<stdio.h>
int main()
{
int str[] = { 1,2,3,4,5,6,7,8,9,10 };
//打开文件
//使用二进制输入输出时,打开的方式也要改为二进制
FILE* pf = fopen("test.txt", "wb");
//判断
if (pf == NULL)
{
perror("fopen:");
return;
}
写文件
fwrite(str, sizeof(int), 4, pf);
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
运行结果
因为是二进制的输入输出,所以使用 .txt 方式打开为我们所看到的乱码,但对于计算机结果是不变的。
2.fread
函数功能 : 从流中读到数据块
函数原型 : size_t fread ( void * ptr, size_t size, size_t count, FILE * stream )
ptr : 指向大小至少为(size * count)字节的内存块的指针
size : 一个元素的大小
count : 元素的数量
stream : 流
#include <stdio.h>
int main()
{
int str[20] = { 0 };
//打开文件
FILE* pf = fopen("test.txt", "rb");
//判断
if (pf == NULL)
{
perror("fopen");
return;
}
//读文件
fread(&str, sizeof(int), 4, pf);
//这里我们自己设置的是读4个元素
int i = 0;
for (i = 0; i < 4; i++)
{
printf("%d ", str[i]);
}
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
目标文件
运行结果
这就是C语言文件操作中顺序读写的函数讲解内容,感谢大家的阅读,让我们一起努力变强吧!