Skip to content

文件的输入输出(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;
}