目录
- 一.文件的顺序读写
-
- 1.顺序读写函数(适合于所有的流)
-
- [1.1 fgetc(读字符)](#1.1 fgetc(读字符))
- [1.2 fputc(写字符)](#1.2 fputc(写字符))
- [1.3 fgets(读字符串)](#1.3 fgets(读字符串))
- [1.4 fput(写字符串)](#1.4 fput(写字符串))
- [1.5 fscanf(格式化地读)](#1.5 fscanf(格式化地读))
- [1.6 fprintf(格式化地写)](#1.6 fprintf(格式化地写))
- 2.顺序读写函数(只适用于文件流)
-
- [2.1 fread(二进制地读)](#2.1 fread(二进制地读))
- [2.2 fwrite(二进制地写)](#2.2 fwrite(二进制地写))
- 二.scanf、fscanf、sscanf的对比
- 三.printf、fprintf、sprintf的对比
一.文件的顺序读写
1.顺序读写函数(适合于所有的流)
1.1 fgetc(读字符)
一个字符一个字符地读
int fgetc(FILE* stream)
从文件中读(拿)字符
参数 是文件指针
返回值 是字符(转为了ASCII码值)
如果读取成功,返回的是ASCII码值 - char
如果读取错误,返回的是EOF(-1)
如果返回值类型是char,那么返回值肯定不等于-1(EOF),这样就没有返回错误与读到文件末尾了
c
int main()
{
FILE* pf = fopen("test.txt", "r");
//以读的形式打开文件
if (pf == NULL)
{
perror("fopen");
return 1;
}
//不为NULL,使用
char ch = 0;
while ((ch = fgetc(pf))!= EOF)
//fgetc读一个字符,光标就往下走一个字符
//读到文件末尾,返回EOF
{
printf("%c\n", ch);
}
fclose(pf);
//关闭文件
pf = NULL;
//文件指针不用了,置为空指针
return 0;
}
1.2 fputc(写字符)
int fputc(int character,FILE* stream)
将字符一个一个地写入文件流中
第一个参数是要写入文件中的字符
第二个参数是文件流
c
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);
//把a到z的字符都写入文件中
}
fclose(pf);
pf = NULL;
return 0;
}
1.3 fgets(读字符串)
char* fgets(char* str,int num,FILE* stream)
第一个参数是从文件流中读出的字符串
第二个参数是重文件流中要读出的字符个数
第三个参数是文件流
如果读取错误或读到文件末尾返回NULL
如果读取成功返回str的起始地址
注意:
fgets会读num-1个字符,最后一位会留给\0(\0是自动放入的)
fgets只读一行,条件允许,把\n也读走
c
int main()
{
FILE* pf = fopen("test.txt", "r");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//读
char str[20] = "xxxxxxxxxxxxxxx";
fgets(str, 10, pf);
printf("%s", str);
fclose(pf);
pf = NULL;
return 0;
}
说明最后一位会自动补 \0
c
int main()
{
FILE* pf = fopen("test.txt", "r");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//读
char str[20] = {0};
fgets(str, 10, pf);
printf("%s", str);
fclose(pf);
pf = NULL;
return 0;
}
说明条件允许,把 \n 也读走了
说明fgets只读一行
1.4 fput(写字符串)
int fputs(const char* str,FILE* stream)
将str指向的字符串写入文件流中
如果写入成功返回一个整数
如果写入失败返回EOF
注意:
\n也会被写入文件中
不把\0写入文件中
c
int main()
{
FILE* pf = fopen("test.txt", "w");
if (pf == NULL)
{
perror("fopen");
return 1;
}
fputs("abcdef\n", pf);
fclose(pf);
pf = NULL;
return 0;
}
1.5 fscanf(格式化地读)
int fscanf(FILE* stream,const char* format)
从指定的输入流(文件或键盘等)上读取格式化的数据
第二个参数是格式化的数据
c
struct s
{
int a;
char b;
char arr[20];
}p;
int main()
{
FILE* pf = fopen("test.txt", "r");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//读
fscanf(pf, "%d %c %s", &(p.a), &(p.b), p.arr);
//打印到屏幕上
fprintf(stdout, "%d %c %s", p.a, p.b, p.arr);
//stdout是标准输出流
fclose(pf);
pf = NULL;
return 0;
}
1.6 fprintf(格式化地写)
int fprintf(FILE* stream,const char* str)
把数据以格式化的形式打印在指定的输出流(屏幕,文件等)上
c
struct s
{
int a;
char b;
char arr[20];
}p;
int main()
{
struct s p = { 18,'a',"zhangsan"};
FILE* pf = fopen("test.txt", "w");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//写
fprintf(pf, "%d %c %s",p.a,p.b,p.arr);
fclose(pf);
pf = NULL;
return 0;
}
2.顺序读写函数(只适用于文件流)
2.1 fread(二进制地读)
size_t fread(const void* str,size_t size,size_t count,FILE* stream);
第一个参数是指向数组的指针
第二个参数是每个元素的大小(以字节为单位)
第三个参数是元素个数
c
int main()
{
FILE* pf = fopen("test.txt", "rb");
// wb 以二进制的方式读出
if (pf == NULL)
{
perror("fopen");
return 1;
}
//写数据
int arr[10] = { 0 };
/*fwrite(arr, sizeof(arr[0]), 6, pf);*/
//以二进制的方式写入
fread(arr, sizeof(arr[0]), 6, pf);
//以二进制的方式读出
for (int i = 0; i < 6; i++)
{
printf("%d ", arr[i]);
//打印6个元素
}
fclose(pf);
pf = NULL;
return 0;
}
2.2 fwrite(二进制地写)
size_t fwrite(const void* ptr,size_t size,size_t count,FILE* stream);
第一个参数是指向数组的指针
第二个参数是每个元素的大小(以字节为单位)
第三个参数是元素个数
c
int main()
{
FILE* pf = fopen("test.txt", "wb");
// wb 以二进制的方式写入
if (pf == NULL)
{
perror("fopen");
return 1;
}
//写数据
int arr[] = { 1,2,3,4,5,6 };
fwrite(arr, sizeof(arr[0]), 6, pf);
//以二进制的方式写入
fclose(pf);
pf = NULL;
return 0;
}
二.scanf、fscanf、sscanf的对比
scanf -- 从标准输入流(键盘)上读取格式化的数据
fscanf -- 从指定的输入流(文件或键盘等)上读取格式化的数据
sscanf -- 把字符串转为格式化的数据再读取(在字符串中读取格式化的数据)
int sscanf(const char* str,const char* format);
c
int main()
{
struct s p = { 18,'a',"zhangsan" };
char buf[200];
//写
sprintf(buf, "%d %c %s", p.a, p.b, p.arr);
//将格式化的数据转为字符串,写入buf中
printf("%s\n", buf);
//打印字符串buf
struct s t = { 0 };
//读
sscanf(buf, "%d %c %s", &(t.a), &(t.b), t.arr);
//从buf中读(拿)字符串,将字符串转为格式化的数据
printf("%d %c %s", t.a, t.b, t.arr);
//打印格式化的数据
return 0;
}
三.printf、fprintf、sprintf的对比
printf -- 把数据以格式化的形式打印在屏幕上
fprintf -- 把数据以格式化的形式打印到指定的输出流(例如屏幕,文件等)上
sprintf -- 把格式化的数据转为字符串(将格式化数据写入字符串)
int sprintf(char* str,const char* format);