目录
常用函数
1. 字符输入、输出函数
2. 文本行输入、输出函数
3. 格式化输入、输出函数
4. 二进制输入、输出函数
常用函数
功能 | 函数名 | 适用于 |
字符输入函数 | fgetc | 所有输入流 |
字符输出函数 | fputc | 所有输出流 |
文本行输入函数 | fgets | 所有输入流 |
文本行输出函数 | fputs | 所有输出流 |
格式化输入函数 | fscanf | 所有输入流 |
格式化输出函数 | fprintf | 所有输出流 |
二进制输入 | fread | 文件 |
二进制输出 | fwrite | 文件 |
将文件内容读取到程序中为输入,将程序内容写入文件中为输出;
1. 字符输入、输出函数
(1)字符输出函数 fputc:
int main()
{
//打开文件
FILE* pf = fopen("E:\\C_文件操作\\C_文件操作\\test1.txt", "w");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//写文件-字符输出函数
//写入字符a至z
char ch = 'a';
for (ch = 'a'; ch <= 'z'; ch++)
{
fputc(ch, pf);
}
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
打开对应文件:
(2)字符输入函数 fgetc:
int main()
{
//打开文件
FILE* pf = fopen("E:\\C_文件操作\\C_文件操作\\test1.txt", "r");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//读文件-字符输入函数
// 打印字符a至z
int ch = 0;
while ((ch = fgetc(pf)) != EOF)
{
printf("%c ", ch);
}
printf("\n");
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
输出结果为:
2. 文本行输入、输出函数
(1)文本行输出函数fputs:
int main()
{
//打开文件
FILE* pf = fopen("E:\\C_文件操作\\C_文件操作\\test.txt", "w");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//写文件
fputs("hello\n", pf);
fputs("world\n", pf);
//关闭文件
fclose(pf);
pf == NULL;
return 0;
}
打开对应文件:
(2)文本行输入函数fgets:
int main()
{
//打开文件
char arr[256] = { 0 };
FILE* pf = fopen("E:\\C_文件操作\\C_文件操作\\test.txt", "r");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//读文件:一次读一行
while (fgets(arr, 255, pf) != NULL)
{
printf("%s", arr);
}
//关闭文件
fclose(pf);
pf == NULL;
return 0;
}
输出结果为:
3. 格式化输入、输出函数
(1)格式化输出:
struct S
{
char name[20];
int age;
double score;
};
int main()
{
struct S s = { "张三", 20, 95.5 };
//打开文件
FILE* pf = fopen("E:\\C_文件操作\\C_文件操作\\test2.txt", "w");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//写文件
printf("%s %d %.1lf\n",s.name, s.age, s.score); //输出在屏幕上
fprintf(pf, "%s %d %.1lf", s.name, s.age, s.score); //输出在文件里
//关闭文件
fclose(pf);
pf == NULL;
return 0;
}
输出结果与对应文件内容如下:
(2)格式化输入函数fscanf:
struct S
{
char name[20];
int age;
double score;
};
int main()
{
struct S s = { 0 };
//打开文件
FILE* pf = fopen("E:\\C_文件操作\\C_文件操作\\test2.txt", "r");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//读文件
fscanf(pf, "%s %d %lf", s.name, &(s.age), &(s.score));
//数组名即数组首元素地址,无需再取地址
printf("%s %d %.1lf\n", s.name, s.age, s.score);
//关闭文件
fclose(pf);
pf == NULL;
return 0;
}
输出结果为:
4. 二进制输入、输出函数
(1) 二进制输出函数fwrite:
struct S
{
char name[20];
int age;
double score;
};
int main()
{
struct S s = { "张三",20,93.5 };
//打开文件
FILE* pf = fopen( "E:\\C_文件操作\\C_文件操作\\test3.txt", "wb");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//二进制方式写文件
fwrite(&s, sizeof(struct S),1, pf);
//关闭文件
fclose(pf);
pf == NULL;
return 0;
}
打开对应文件:
(2) 二进制输入函数fread:
struct S
{
char name[20];
int age;
double score;
};
int main()
{
struct S s = { 0 };
//打开文件
FILE* pf = fopen( "E:\\C_文件操作\\C_文件操作\\test3.txt", "rb");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//二进制方式读文件
fread(&s, sizeof(struct S), 1, pf);
printf("%s %d %.1lf\n", s.name, s.age, s.score);
//关闭文件
fclose(pf);
pf == NULL;
return 0;
}
输出结果为:
PS:(1)当一个C程序运行起来,标准输入流stdin,标准输出流stdout,标准错误流stderr是默认打开的。fgetc与fputc分别适用于所有输入流与输出流,故而除了读取与存储于文件操作外,还可以直接与键盘、屏幕交互:
int main()
{
int ch = fgetc(stdin);
fputc(ch, stdout);
return 0;
}
上文代码即可从键盘输入,从屏幕输出;
(2)对比scanf fscanf sscanf 与 printf fprintf sprintf
其中sprintf函数的功能是把一个格式化的数据转换成字符串;
sscanf函数的功能是把一个字符串转换成格式化数据;
sscanf 与 sprintf 函数示例:
struct S
{
char name[20];
int age;
double score;
};
int main()
{
char buffer[256] = { 0 };
struct S s = { "张三", 20, 93.5 };
struct S tmp = { 0 };
sprintf(buffer, "%s %d %.1lf\n", s.name, s.age, s.score);
//将结构体s保存在字符串buffer中
printf("%s\n", buffer);
//以字符串形式打印
sscanf(buffer,"%s %d %lf\n", tmp.name, &(tmp.age), &(tmp.score));
//将字符串buffer转换为结构体数据
printf("%s %d %.1lf", tmp.name, tmp.age, tmp.score);
//格式化打印
return 0;
}
输出结果为: