C语言学习之 文件输入输出.day2

本文讲解了如何使用C语言操作二进制文件,包括从键盘输入10个学生数据并保存到stu.dat文件,以及验证文件内容并按奇数索引读取和显示部分数据。着重解析了'rb'和'rw'模式的区别,以及二进制文件的存储原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对函数功能不熟练。

对“rb”"rw"这种方式不是很理解,二进制文件方式?文件中看不到,但是

能输出并显示到控制台上。

1.从键盘输入10个学生的有关数据,然后把它们转存到磁盘文件上去。

#include <stdio.h>
#define SIZE 10
struct Student_type
{	char name[10];
	int num;
	int age;
	char addr[15];
}stud[SIZE];	//定义全局结构体数组stud,包含10个学生数据

void save()	//定义函数save,向文件输出SIZE个学生的数据
{	FILE *fp;
	int i;
	if((fp=fopen("stu.dat","wb"))==NULL)	//打开输出文件stu.dat
	{	printf("cannot open file\n");
		return;
	}
	for(i=0;i<SIZE;i++)
		if(fwrite(&stud[i],sizeof(struct Student_type),1,fp)!=1)
			printf("file write error\n");
	fclose(fp);
}

int main()
{	int i;
	printf("Please enter data of students:\n");
	for(i=0;i<SIZE;i++)
	//输入SIZE个学生的数据,存放在数组stud中
	scanf("%s%d%d%s",stud[i].name,&stud[i].num,
		&stud[i].age,stud[i].addr);
	save();
	return 0;
}

2.验证在磁盘文件stu.dat中是否已存在数据

#include <stdio.h>
#include <stdlib.h>
#define SIZE 10
struct Student_type
{	char name[10];
	int num;
	int age;
	char addr[15];
}stud[SIZE];

int main()
{	int i;
	FILE *fp;
	if((fp=fopen("stu.dat","rb"))==NULL)	//打开输入文件stu.dat
	{	printf("cannot open file\n");
		exit(0);
	}
	for(i=0;i<SIZE;i++)
	{	fread(&stud[i],sizeof(struct Student_type),1,fp);	//从fp指向的文件读入一组数据
		printf("%-10s %4d %4d %-15s\n",
         stud[i].name,stud[i].num,stud[i]. age,stud[i].addr);
		//在屏幕上输出这组数据
	}
	fclose(fp);						//关闭文件stu_list
	return 0;
}

3.怎样向文件读写一个字符串

(1) 数据的存储方式

文本方式: 数据以字符方式(ASCII代码)存储到文件中。如整数12,送到文件时占2个字节,而不是4个字节。以文本方式保存的数据便于阅读。

二进制方式: 数据按在内存的存储状态原封不动地复制到文件。如整数12,送到文件时和在内存中一样占4个字节。

(2) 文件的分类

文本文件(ASCII文件):   文件中全部为ASCII字符。

二进制文件: 按二进制方式把在内存中的数据复制到文件的,称为二进制文件,即映像文件。

(3) 文件的打开方式

文本方式: 不带b的方式,读写文件时对换行符进行转换。

二进制方式: 带b的方式,读写文件时对换行符不进行转换。

(4) 文件读写函数

文本读写函数: 用来向文本文件读写字符数据的函数(如fgetc,fgets,fputc,fputs,fscanf,fprintf等)。

二进制读写函数: 用来向二进制文件读写二进制数据的函数(如getw,putw,fread,fwrite等)。

4.有一个磁盘文件,内有一些信息。要求第1次将它的内容显示在屏幕上,第2次把它复制到另一文件上。

#include<stdio.h>
int main()
{	char ch;
	FILE *fp1,*fp2;
	fp1=fopen("file1.dat","r");	//打开输入文件
	fp2=fopen("file2.dat","w");	//打开输出文件
	ch=getc(fp1);				//从file1.dat文件读入第一个字符
	while(!feof(fp1))			//当未读取文件尾标志
	{	putchar(ch);			//在屏幕输出一个字符
		ch=getc(fp1);			//再从file1.dat文件读入一个字符
	}
	putchar(10);				//在屏幕执行换行
	rewind(fp1);				//使文件位置标记返回文件开头
	ch=getc(fp1);				//从file1.dat文件读入第一个字符
	while(!feof(fp1))			//当未读取文件尾标志
	{	fputc(ch,fp2);			//向file2.dat文件输出一个字符
		ch=fgetc(fp1);			//再从file1.dat文件读入一个字符
	}
	fclose(fp1);fclose(fp2);
	return 0;
}

5.在磁盘文件上存有10个学生的数据。要求将第1,3,5,7,9个学生数据输入计算机,并在屏幕上显示出来。

#include<stdio.h>
#include <stdlib.h>
struct Student_type	//学生数据类型
{	char name[10];
	int num;
	int age;
	char addr[15];
}stud[10];
int main()
{	int i;
	FILE *fp;
	if((fp=fopen("stu.dat","rb"))==NULL)	//以只读方式打开二进制文件
	{	printf("can not open file\n");
		exit(0);
	}
	for(i=0;i<10;i+=2)
	{	fseek(fp,i*sizeof(struct Student_type),0);	//移动文件位置标记
		fread(&stud[i],sizeof(struct Student_type),1,fp);	//读一个数据块到结构体变量
		printf("%-10s %4d %4d %-15s\n",
         stud[i].name,stud[i].num,stud[i].age,stud[i].addr);
	 	//在屏幕输出
	}
	fclose(fp);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值