一、什么是文件?
计算机磁盘上的文件就是文件,文件一般分为两种,程序文件和数据文件,当然文件可以不包含后缀名,创建时后缀名可以是任意的。
程序文件:包括源文件(后缀为.c)目标文件(windows环境下为obj文件),可执行程序 (windows环境下后缀为.exe)。
数据文件:故名思意就是就是对程序的数据进行保存的文件,例如每一次打开vs需要重新输入数据,所以需要对数据进行保存。
二、文件的基本操作
1.文件的打开和关闭
1.打开文件:需要注意的是该文件的返回值是需要一个指针来接收的,在VS环境下成功将会返回一个FILE类型的指针,还需注意第二个参数需要用双引号。
2.关闭文件:文件的如果成功关闭返回0,失败返回EOF。
代码如下(示例):
int main() { FILE*pf=fopen("myfile.txt", "w"); //打开文件(这里是相对路径) //如果是写的话,没有该文件会自动创建一个 //如果是读文件,没有该文件会返回一个空指针 assert(pf); //关闭文件 fclose(pf); pf=NULL; return 0; }
2.0文件的读写
a.字符输出:
int main()
{
FILE*pf=fopen("myfile.txt", "w");
assert(pf);
//int fputc ( int character, FILE * stream );
// 一次只能输出一个字符
//参数一,输入你要输入字符的ASCII值,参数二,对应指针
int i = 0;
for (i = 0; i < 26; i++)
{
fputc('a' + i, pf);
}
fclose(pf);
pf=NULL;
return 0;
}
文本中看见的结果:abcdefghijklmnopqrstuvwxyz
b:字符输入:
int main() { //文本中上一次存入的是abcdef FILE* pf = fopen("myfile.txt","r");//读取文件注意r //int fgetc ( FILE * stream ); //返回值是该字符的ASCII值 printf("%c\n",fgetc(pf)); fclose(pf); pf=NULL; return 0; }
返回值:
c:文本行输出:
文本在还没有关闭的时候,每一次进行文本行输入如果字符串中没有换行操作,打开将会在上一次的结束位置,如果有换行操作打开将在下一行进行输入。
int main() { FILE* pf = fopen("myfile.txt","w"); //文本行输出 //int fputs ( const char * str, FILE * stream ); //该函数失败会返回EOF fputs("abcdef\n",pf);//\n表示在文本中换行的意思 fputs("hello world!",pf); fclose(pf); pf=NULL: return 0; }
输出的文本中的结果是:
d:文本行输入
读取时,只会读取n-1个字符保存在str中,第num个字符文本中无论是不是\0,num个字符还是会成为\0,如果num大于这行的字符个数,还是不会读取下一行的字符
int main()
{
//上一次保存的是abcdef
FILE* pf = fopen("myfile.txt","r");
//char * fgets ( char * str, int num, FILE * stream );
//将pf指针,num-1个字符读入str字符串中
//如果读取失败返回NULL,读取成功返回首字符地址
char str[] = "#########";
char* ptr = fgets(str,3,pf);
printf("%s\n", ptr);
fclose(pf);
pf=NULL:
return 0;
}
e:二进制输出:
size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );可以理解为:读取ptr中count个大小为size的数据到stream中去
int main()
{
FILE*pf=fopen("myfile.txt","wb");
//size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );
//将ptr数组中的数据输出count个size大小的数据到stream中
int tmp = 20000;
fwrite(&tmp,sizeof(int),1,pf);
fclose(pf);
return 0;
}
f:二进制输入:
size_t fread ( void * ptr, size_t size, size_t count, FILE * stream )理解为:将stream中的数据读取count个大小为size的数据到ptr中去
下图为文本中存有20000的数据,通过二进制的读取
需要注意的是,对于任意一个C程序就默认打开三个流
stdin---标注输入流----键盘
stdout--标准输出流---屏幕
stderr---标准错误流----键盘
2.1文件的随机的读写:
1.偏移到指定位置
int fseek ( FILE * stream, long int offset, int origin );
offset:偏移量,单位:字节
origin:有三中选择位置:SEEK_SET(文件的初始位置),SEEK_SUR(当前文件指针的位置),SEEK_END(文件的末尾)
2.返回文件指针相对于起始位置的偏移量:
long int ftell ( FILE * stream );
3.让文件返回到初始位置
void rewind ( FILE * stream );
3.文件结束的判断:
1.feof是很多人会判断错误的,这不是判断文件读取结束的标志,feof是判断当文本读取停止时,是因为读取发生意外停止,还是因为遇见文本尾结束。
fgetc()函数的结束标志:判断返回值是不是EOF;
fgets()函数的结束标志:判断返回值是否是NULL;
fread()函数的结束标志:读取到的个数小于count个;
4.scanf/fscanf/sscanf和printf/fprintf/sprintf函数比较