文件的输入输出(1)
约 1290 字大约 4 分钟
2024-07-07
77.文件的基本概念
文件分类
程序文件
这种文件的内容是程序代码,如源程序文件,目标文件,可执行文件等
数据文件
其内容不是程序,而是供程序运行时读写的数据 终端即计算机的各种输入输出设备。操作系统把终端都统一作为文件看待 一个文件要有唯一的文件标识,文件标识包括3个部分: ①文件路径 ②文件名主干 ③文件后缀 数据文件分类:ASCII(文本文件)和二进制文件(镜像文件)
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char name[50]= "H:/Java/Dos命令.txt";
FILE *fp = fopen(name,"r");
if(fp ==NULL)
{
printf("文件打开失败,程序退出\n");
exit(-1);
}
FILE *fp2 = fopen("H:\\Dos命令2.txt","w");
if(fp2 == NULL)
{
printf("文件打开失败,程序退出\n");
exit(-1);
}
char ch;
while((ch = fgetc(fp)) !=EOF)
fputc(ch,fp2);
fclose(fp);
fclose(fp2);
return 0;
}
78.读入文件并输出指定位置
文件使用方式 | 含义 | 如果指定文件不存在 |
---|---|---|
"r"(只读) | 为了输出数据,打开一个已存在的文本文件 | 出错 |
"w"(只写) | 为了输出数据,打开一个文本文件 | 建立新文件 |
"a"(追加) | 向文本文件末尾添加数据 | 建立新文件 |
"rb"(只读) | 为了输出数据,打开一个二进制文件 | 出错 |
"wb"(只写) | 为了输出数据,打开一个二进制文件 | 建立新文件 |
"ab"(追加) | 向二进制文件末尾添加数据 | 建立新文件 |
"r+"(读写) | 为了读和写,打开一个文本文件 | 出错 |
"w+"(读写) | 为了读和写,新建一个文本文件 | 建立新文件 |
"a+"(读写) | 为了读和写,打开一个文本文件 | 建立新文件 |
"rb+"(读写) | 为了读和写,打开一个二进制文件 | 出错 |
"wb+(读写)" | 为了读和写。新建的二进制文件 | 建立新文件 |
"ab+(读写)" | 为了读和写,打开了一个二进制文件 | 建立新文件 |
不带b,操作的是文本文件,带b操作的是二进制文件,带+是读写;如果指定文件不存在,只有带r的才会出错
带w的,若文件存在则文件长度为0,即该文件内容消失,若该文件不存在则建立该文件
对一个文件进行读和写,读到或者写到哪一个位置,是通过“文件位置标记”实现的
带r和带w的,文件位置标记都是在文件的开头位置;如果我们想对一个文件添加数据,就使用带a的,文件位置标记会在文件的末尾位置
如果fopen不能打开文件,其返回值为NULL
有的c编译系统可能不能完全提供上述表格的功能,有的会用"rw","wr","ar"替代"r+","w+","a+
程序中可以使用三个标准流文件——标准输入流、标准输出流、标准出错输入流
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char a[10];
FILE *fp =fopen("H:\\Java\\Dos命令.txt","r");
if(fp == NULL)
{
printf("打开文件失败,程序退出");
exit(-1);
}
//打开的文件输出到屏幕上
fgets(a,10,fp); //程序第一次调用该句,a数数读到换行符时,fgets函数结束读入
fputs(a,stdout);
fgets(a,10,fp); //程序第二次调用该句,a数组遇到最大容纳有效字符的格式9时,gets函数结束读入
fputs(a,stdout);
fgets(a,10,fp); //程序第三次调用该句,a数组读到文件末尾,gets函数结束读入
fputs(a,stdout);
putchar('\n');
//键盘输入的数据使用fgets和fputs输出到屏幕上
while(fgets(a,10,stdin) != NULL) //windows系统下,在新的一行(切机)按下ctrl+z回车,就会输入文件结束标志EOF
fputs(a,stdout);
fclose(fp);
fp=NULL; //最好将一个使用完毕的指针赋值为NULL,避免野指针的出现
return 0;
}
79.向文件读写一个字符串
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE * p1 =fopen("H:/Java/Dos命令.txt","r");
if(p1 == NULL)
{
printf("文件打开失败,程序结束\n");
exit(-1);
}
FILE * p2 =fopen("H:\\Java\\Dos命令3.txt","w");
if(p2 == NULL)
{
printf("文件打开失败,程序结束\n");
exit(-1);
}
int a;
double b;
char c [40];
fscanf(p1,"%d%lf%s",&a,&b,c);
fprintf(p2,"%d\n%.llf\n%s",a,b,c);
fclose(p1);
fclose(p2);
p1 = NULL;
p2 = NULL;
return 0;
}
80.用格式化的方式读写文件
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
char name[30];
double score;
}Stu;
int main(void)
{
Stu a[3] = {{"张三",56.3},{"十分",99},{"王五",34}};
FILE *p1= fopen("H:/Java/Dos命令4.abc","wb");
if(p1 == NULL)
{
printf("打开文件失败,程序退出\n");
exit(0);
}
fwrite(a,sizeof(Stu),3,p1);
printf("%s%.1lf\n",a->name,a->score);
fclose(p1);
p1 = fopen("H:/Java/Dos命令4.abc","rb");
if(p1 == NULL)
{
printf("打开文件失败,程序退出\n");
exit(0);
}
Stu b[3];
fread(b,sizeof(Stu),3,p1);
for(int i =1;i<3;++i)
printf("第%d个学生的姓名:&s,成绩:%.1lf\n",i+1,b[i].name,b[i].score);
fclose(p1);
return 0;
}