文件
1.文件的分类
程序文件
包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境
后缀为.exe)。
数据文件
文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。
本章讨论的是数据文件。在以前各章所处理数据的输入输出都是以终端为对象的,即从终端的键盘输入数据,运行结果显示到显
示器上。其实有时候我们会把信息输出到磁盘上,当需要的时候再从磁盘上把数据读取到内存中使用,这里处理
的就是磁盘上文件。
2文件的打开与关闭
每个被打开的文件都在内存中开辟一个相应的文件信息去,用来存放文件信息。这些信息保存在一个结构体变量中。结构体取名为FILE。创建一个FILE* pf 的指针变量,通过pf可以文件里面的内容进行操作。
使用文件指针的通用步骤:
FILE * pFile;
//打开文件
pFile = fopen ("myfile.txt","w");
//文件操作
if (pFile!=NULL)
{
fputs ("fopen example",pFile);
//关闭文件
fclose (pFile);
}
3文件的顺序读写
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8WO0rlhr-1689739546285)(C:\Users\22724\AppData\Roaming\Typora\typora-user-images\image-20230717120431137.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VmHmDkEC-1689739546285)(C:\Users\22724\AppData\Roaming\Typora\typora-user-images\image-20230717120636895.png)]
fgetc 与fputc的操作
int main(void)
{
//以写的方式创建文件
FILE* pf = fopen("da.txt", "w");
//判断文件
if(pf== NULL)
{
perror("fopen");
return;
}
//写文件
//fputc('a',pf);//字符是以ascll码存储的
//fputc('a', stdout);//stdout将'a'输出到屏幕上
//读文件fgetc
int ch = fgetc(pf); //适用于标准输入流, 文件输入流, 操作对象是字符,当文件读完或读取失败时,会返回EOF
//关闭文件
fclose(pf);
pf = NULL;
}
fgets与fputs的操作
*int main(void)
{
FILE* pf = fopen("da.txt", "r");*///写的时候为w,读的时候位r
//fputs 文本行输出函数
fputs("abcdf", pf);
//判断文件
if(pf== NULL)
{
perror("fopen");
return;
}
fgets 文本行输入函数
char arr[10];
int c = fgets(arr,2,pf );//实际上只读取了一位,因为最后一位要加上'\0'我强强强强1
printf("%s", arr);
关闭文件
fclose(pf);
pf = NULL;
}
fprintf,fscanf,格式化的输出流与输入流
struct S
{
int i;
char a;
};
int main(void)
{
FILE* pf = fopen("da.txt", "r");
//判断文件
if(pf== NULL)
{
perror("fopen");
return;
}
struct S s;
/* s.i = 10;
s.a = 'c';*/
fprintf(pf, "%d %c", s.i, s.a);//从后面往前面输出到pf里面
// 下面以读的形式
struct S s = { 0 };
fscanf(pf, "%d %c", &(s.i), &(s.a));//从前面往后面输出
printf("%d %c", s.i, s.a);
fclose(pf);
pf = NULL;
}
sprintf ,sscanf用于非文件的操作
struct S
{
int a;
char i;
};
int main()
{
struct S s = {0};
char arr[30] ;
scanf("%s", arr);
sprintf(arr,"%d %c\n",s.a,s.i);//注意空格在%d 与%c,也会输入到arr中
printf("%s ", arr);
sscanf(arr, "%c", &(s.i));
return 0;
fseek的使用
int main(void)
{
FILE* pf = fopen("da.txt", "r");
if (pf == NULL)
{
perror("fopen");
return;
}
fseek(pf, 5, SEEK_SET);//从下标为5的位置开始读
}
feof用于检测文件读取结束的原因,ferror判定文件是否读取失败
int main(void)
{
FILE* pf = fopen("da.txt", "r");
if (!pf)
{
perror("fopen");
return;
}
int c ;
while ((c = fgetc(pf)) != EOF)
{
putchar(c);
}
//putchar(1);
if (ferror(pf))
{
perror("ferror");
}
else if(feof(pf))
{
puts("文件读取结束");
}
}