目录
一、文件存在的意义
代码运行结果出现在屏幕上后,结束运行,关闭程序,屏幕上的内容也随之消失,无法保存。文件的意义就在于可以保存数据,不会因程序停止运行而删除数据。
二、文件及其分类
文件可以分为程序文件(即我们平常写的代码)和数据文件(目的是为了保存数据)。
三、文件的打开和关闭
1.文件的打开函数
FILE* fopen(const char* filename, const char* mode);
其中,filename是打开操作对象的文件名,mode是指文件的打开方式。
打开方式整理如下:
文件使用方式 | 含义 | 如果指定文件不存在 |
“r”(只读) | 为了输入数据,打开一个已经存在的文本文件 | 出错 |
“w”(只写) | 为了输出数据,打开一个文本文件 | 建立一个新的文件 |
“a”(追加) | 向文本文件尾添加数据 | 建立一个新的文件 |
“rb”(只读) | 为了输入数据,打开一个二进制文件 | 出错 |
“wb”(只写) | 为了输出数据,打开一个二进制文件 | 建立一个新的文件 |
“ab”(追加) | 向一个二进制文件尾添加数据 | 出错 |
“r+”(读写) | 为了读和写,打开一个文本文件 | 出错 |
“w+”(读写) | 为了读和写,建议一个新的文件 | 建立一个新的文件 |
“a+”(读写) | 打开一个文件,在文件尾进行读写 | 建立一个新的文件 |
“rb+”(读写) | 为了读和写打开一个二进制文件 | 出错 |
“wb+”(读写) | 为了读和写,新建一个新的二进制文件 | 建立一个新的文件 |
“ab+”(读写) | 打开一个二进制文件,在文件尾进行读和写 | 建立一个新的文件 |
2.文件的关闭函数
int fclose(FILE* stream);
举例:
/* fopen fclose example */
#include <stdio.h>
int main()
{
FILE* pFile;
//打开文件
pFile = fopen("myfile.txt", "w");//只写,如果该文件已经存在,原来保存的内容会被清空;
//如果该文件不存在,建立新文件
//文件操作
if (pFile != NULL)
{
fputs("fopen example", pFile);//像文件中输储字符串"fopen example"
//关闭文件
fclose(pFile);
}
return 0;
}
四、文件的顺序读写
1.常用函数
功能 | 函数名 | 适用于 |
---|---|---|
字符输入函数 | fgetc | 所有的输入流 |
字符输出函数 | fputc | 所有的输出流 |
文本行输入函数 | fgets | 所有的输入流 |
文本行输出函数 | fputs | 所有的输出流 |
格式化输入函数 | fscanf | 所有的输入流 |
格式化输出函数 | fprintf | 所有的输出流 |
二进制输入函数 | fread | 文件 |
二进制输出函数 | fwrite | 文件 |
1.fgetc()函数
函数原形:int fgetc ( FILE * stream );
函数功能:读取stream指向的输入流中的一个字符,返回这个字符的ASCII值。
2.fputc()函数
函数原形:int fputc ( int character, FILE * stream );
函数功能:输出一个字符到stream指向的文件中,返回这个字符的ASCII值。
3.fgets()函数
函数原形:char * fgets ( char * str, int num, FILE * stream );
函数功能:读取stream指向的输入流的前num-1个字符,第num个为固定的'\0',返回str。
4.fputs()函数
函数原形:int fputs ( const char * str, FILE * stream );
函数功能:将str指向的内容输出到stream指向的输出流中,成功返回非-1(EOF)的值。
5.fread()函数
函数原形:size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
函数功能:将stream指向的输入流中读取大小为size的前count个元素放入ptr指向的内存。返回值是成功读取的元素个数,读取失败返回-1。
6.fwrite()函数
函数原形:size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );
函数功能:将ptr指向的内存空间的大小为size的前count个元素放入stream指向的输出流中。输出成功返回输出的元素个数,输出失败返回-1。
2.对比一组函数:
1.fscanf/scanf/sscanf
相同点:
fscanf、scanf、sscanf都是是格式化输入函数。
不同点:
1.fscanf适用于读取所有的输入流中的数据。
函数原形:int fscanf(FILE* stream, const char* format, ...);
代码举例:
按照顺序写文本行
//int main()
//{
// //打开文件
// FILE* pf = fopen("test.txt", "w");//以只写的方式打开一个已经存在的文件时,文件之前的内容会被清空
//
// if (NULL == pf)
// {
// perror("fopen");
// return 1;
// }
//
// //写文件-一行一行写
// fputs("hello\n", pf);
// fputs("bitejiuyeke\n", pf);
// //文件test.txt中已有内容:
// // hello
// // bitejiuyeke
// //关闭文件
// fclose(pf);
// pf = NULL;
//
// return 0;
//}
//可读可写文件,测试fscanf函数
int main()
{
//打开文件
FILE* pf = fopen("test.txt", "r+");//读写
char arr1[20] = "";
char arr2[20] = "";
fscanf(pf, "%s", arr1);
fscanf(pf, "%s", arr2);
printf("%s\n", arr1);
printf("%s\n", arr2);
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
2.scanf适用于读取标准输入流中的数据。
函数原形:int scanf(const char* format, ...);
#include <stdio.h>
int main()
{
int a = 0;
scanf("%d",&a);
printf("%d\n",a);
return 0;
}
3.sscanf适用于在字符串中读取到格式化数据。
函数原形:int sscanf(const char* s, const char* format, ...);
其中,s即为格式化数据来源的字符串。
#include <stdio.h>
//sscanf()函数的应用
int main()
{
char arr[50] = "18zhangsanman";
int age = 0;
char name[20] = "";
char sex[8] = "";
//读取字符串的内容,赋值给其他变量
sscanf(arr, "%2d%8s%3s", &age, name, sex);
printf("%d %s %s\n", age, name, sex);
return 0;
}
2.fprintf/printf/sprintf
相同点:
fprintf、printf、sprintf都是格式化输出函数。
不同点:
1. fprintf适用于所有输出流。将格式化数据输出到输出流上打印(屏幕/文件)。
函数原形:int fprintf(FILE* stream, const char* format, ...);
#include <stdio.h>
//fprintf()函数的应用
int main()
{
FILE* pf = fopen("test.txt", "w");//读写
if (NULL == pf)
{
perror("fopen");
return 1;
}
char arr[20] = "I love English!\n";
fprintf(pf, "%s", arr);
return 0;
}
2.printf适用于标准输出流。将格式化数据打印在屏幕上。
函数原形:int printf(const char* format, ...);
#include <stdio.h>
int main()
{
int a = 5;
printf("%d\n",a);
return 0;
}
3.sprintf适用于将格式化数据的内容转化为字符串。
函数原形:int sprintf(char* str, const char* format, ...);
其中,str即为放入将格式化数据转化为字符串的内容的字符串。
#include <stdio.h>
//sprintf()函数的应用
int main()
{
int year = 2022;
int month = 10;
int day = 8;
char arr[20] = "";
sprintf(arr, "%d%d%d", year, month, day);
printf("%s\n", arr);
return 0;
}
总结理解:输入输出针对的对象是程序文件(即我们写的代码),输入是指从数据文件(fscanf、scanf)或字符串(sscanf)中读取内容格式化后赋值给代码中创建的变量;输出是指将代码中的变量的值格式化后放入数据文件(fprintf、printf)或字符串(sprintf)中。