完全自学C(干货) —— 文件

(C语言)利用结构体数组制作学生成绩管理系统 要求: 某班有最多不超过30人(具体人数由键盘输入)参加期末考试,最多不超过6门(具体门数由键盘输入)。定义结构体类型描述学生信息,每个学生信息包括:学号、姓名、多门课的成绩、总成绩和平均成绩。用结构体数组作为函数参数,编程实现如下菜单驱动的学生成绩管理系统。 (1) 录入每个学生的学号、姓名和各科考试成绩。 (2) 计算每门课程的总分和平均分。 (3) 计算每个学生的总分和平均分。 阅读详情

目录

一,文件分类

程序文件

数据文件

 二,文件

文件名

文件指针

三,文件的打开和关闭

四,流概念

四,文件读写

文件的顺序读写

文件的随机读写

五,其他

文本文件和二进制文件

文件的结束判定

文件缓冲区

三,案例


  • 程序文件
  • 数据文件

一,文件分类

程序文件

  • 源程序文件(.c);
  • 目标文件(windows环境.obj),编译过程中的临时文件;
  • 可执行文件(windows环境.exe)等;

数据文件

  • 文件的内容不一定是程序,而是程序运行时读写的数据;
  • 如程序运行需要从中读取数据的文件,或输出内容的文件;

 二,文件

  • 一个文件要有一个唯一的文件标识,以便用户识别和引用;

文件名

  • 文件路径
  • 文件名主干
  • 文件后缀

如c:\code\test.txt

 

文件指针

  • 在缓冲文件系统中,关键的概念是“文件类型指针”,简称文件指针;
  • 每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息;
    • 如文件的名字,文件状态及文件当前的位置等;
  • 这些信息是保存在一个结构体变量中的,该结构体类型系统有声明,取名FILE;
  • 不同C编译器,FILE类型包含的内容不完全相同,但大同小异;
  • 每当打开一个文件时,系统会根据文件情况,自动创建一个FILE结构的变量,并填充其中的信息;
  • 一般都是通过一个FILE的指针来维护这个FILE结构的变量,这样使用起来更加方便;
    • 如 FILE* pf;

三,文件的打开和关闭

  • 文件在读写之前,应该先打开文件,在使用结束后,应该关闭文件;
  • 打开文件的同时,都会返回一个FILE*的指针变量指向该文件;
  • 打开文件fopen,关闭文件fclose;
int main()
{
	FILE* pf = fopen("F:\\VS\\Project1\\test.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 0;
	}

	fclose(pf);
	pf = NULL;
	return 1;
}

注:文件打开方式

四,流概念

  • 文件流;
  • 标准输入输出流stdin/stdout;

注:默认打开3个流(类型均为FILE*)

  • stdin,标准输入流(键盘);
  • stdout,标准输出流(屏幕);
  • stderr,标准错误流(屏幕);
fgetc(stdin); //从流(屏幕)中,读取一个字符;
fputc('b', stdout); //输出/写入一个字符,到流(屏幕)中;

标准输入输出流读写

  • gets,获取一行字符串从stdio;
  • puts,写出一行字符串到stdout;
char* ch[10];
gets(ch); //从stdin流中,获取一行;
puts(ch); //输出/写入字符串,到stdout流中;

备注:

  • scanf/printf,针对标准输入输出流,格式化输入输出语句;
  • fscanf/fprintf,针对所有输入输出流,格式化输入输出语句;
  • sscanf/sprintf,sscanf是从字符串中读取格式化的数据,sprintf是把格式化数据输出到字符串;

四,文件读写

文件的顺序读写

 内存与硬盘读写: 

 

 文件读写函数:
//输入、输出当个字符
int main()
{
	FILE* pf = fopen("test.txt", "w+");
	if (pf == NULL)
	{
		perror("fopen");
		return 0;
	}
	//输出/写入字符
	fputc('b', pf);
	fputc('i', pf);
	fputc('t', pf);
	//文件指针移动到起始位置
	fseek(pf, 0L, SEEK_SET);
	//输入/读取字符
	printf("%c", fgetc(pf));
	printf("%c", fgetc(pf));
	printf("%c", fgetc(pf));

	fclose(pf);
	pf = NULL;
	return 1;
}
//输入、输出一行字符
int main()
{
	char str[] = "abcde";
	FILE* pf = fopen("test.txt", "w+");
	if (pf == NULL)
	{
		perror("fopen");
		return 0;
	}
	//输出/写入字符串
	fputs("bit", pf);
	//文件指针移动到起始位置
	fseek(pf, 0L, SEEK_SET);
	//输入/读取字符串
	fgets(str, 2, pf); //2个字符包含'\0'
	printf("%s", str);
	fgets(str, 2, pf); //2个字符包含'\0'
	printf("%s", str);

	fclose(pf);
	pf = NULL;
	return 1;
}
//格式化数据输入、输出
struct S
{
	char str[100];
	int num;
};

int main()
{
	struct S s1 = { "bit",10 };
	struct S s2 = { {0},0 };
	FILE* pf = fopen("test.txt", "w+");
	if (pf == NULL)
	{
		perror("fopen");
		return 0;
	}
	//输出/写入格式化数据
	fprintf(pf, "%s ", s1.str);
	fprintf(pf, "%d ", s1.num);
	//文件指针移动到起始位置
	fseek(pf, 0L, SEEK_SET);
	//输入/读取格式化数据,截止到空格
	fscanf(pf, "%s", s2.str);
	fscanf(pf, "%d", &(s2.num));
	printf("%s %d", s2.str, s2.num);

	fclose(pf);
	pf = NULL;
	return 1;
}
//二进制输入、输出
struct S
{
	char str[100];
	int num;
};

int main()
{
	struct S s1 = { "bit",10 };
	struct S s2 = { {0},0 };
	FILE* pf = fopen("test.txt", "w+");
	if (pf == NULL)
	{
		perror("fopen");
		return 0;
	}
	//二进制输出/写入
	fwrite(&s1,sizeof(struct S),1,pf);
	//文件指针移动到起始位置
	fseek(pf, 0L, SEEK_SET);
	//二进制输入/读取
	fread(&s2, sizeof(struct S), 1, pf);
	printf("%s %d", s2.str, s2.num);

	fclose(pf);
	pf = NULL;
	return 1;
}
struct S
{
	char name[10];
	int num;
	float score;
};

int main()
{
	struct S s1 = { "lisi",20,99.5f };
	char str[100] = { 0 };
	//从s1中格式化数据,输出到str
	sprintf(str, "%s %d %f", s1.name, s1.num, s1.score);
	printf("%s\n", str);

	struct S s2 = { 0 };
	//从str中读取格式化数据,到s2
	sscanf(str, "%s %d %f", s2.name, &(s2.num), &(s2.score));
	printf("%s %d %f", s2.name, s2.num, s2.score);
	return 0;
}

文件的随机读写

  • fseek,根据文件指针的位置和偏移量来定位文件指针;
  • origin,需为SEEK_CUR(当前位置)、SEEK_END(文件末尾位置)、SEEK_SET(文件起始位置);
  • ftell,返回文件指针相对于起始位置的偏移量;
  • rewind,让文件指针的位置回到文件的起始位置;
int main()
{
	FILE* pf = fopen("test.txt", "w+");
	if (pf == NULL)
	{
		perror("fopen");
		return 0;
	}
	//输出/写入字符
	fputc('b', pf);
	fputc('i', pf);
	fputc('t', pf);
	//文件指针移动到起始位置
	fseek(pf, 0L, SEEK_SET);
	printf("%c\n", fgetc(pf));
	//文件指针移动到末尾位置
	fseek(pf, -2L, SEEK_END);
	printf("%c\n", fgetc(pf));
	//文件指针移动到当前位置
	fseek(pf, 0L, SEEK_CUR);
	printf("%c\n", fgetc(pf));
	//返回当前指针偏移量
	printf("%d\n", ftell(pf));
	//文件指针移动到起始位置
	rewind(pf);
	printf("%c\n", fgetc(pf));

	fclose(pf);
	pf = NULL;
	return 1;
}

五,其他

文本文件和二进制文件

  • 数据的组织形式可分为文本文件和二进制文件;
    • 数据在内存中以二进制形式存储,不加转换即输出到外存的,即为二进制文件;
    • 数据在内存中以二进制形式存储,转换为ASCII码输出到外存的,即为文本文件;

数据在文件中存储形式

  • 字符一律以ASCII码形式存储;
  • 数值型数据,即可ASCII码形式存储,也可二进制形式存储;

文件的结束判定

feof
  • 常被错误使用,用来判定文件结束;
  • 在文件读取过程中,不能用feof函数的返回值,来直接判断文件是否结束;
  • 而是应该用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束;

文本文件读取是否结束

  • fgetc,读取结束时返回EOF,正常读取为字符ASCII码值;
  • fgets,读取结束时返回NULL,正常读取为字符串起始位置;

二进制文件读取是否结束

  • fread,正常返回实际元素个数,如小于实际要读的个数则文件读取结束了;
//将文件test1.txt,复制到test2.txt
int main()
{
	FILE* pfr = fopen("test1.txt", "r");
	if (pfr == NULL)
	{
		perror("pfr");
		return 0;
	}
	FILE* pfw = fopen("test2.txt", "w");
	if (pfw == NULL)
	{
		perror("pfw");
		return 0;
	}

	char c = 0;
	//读取失败或文件结束时,均会返回EOF
	while ((c = fgetc(pfr)) != EOF)
	{
		fputc(c, pfw);
	}

	if (ferror(pfr))
		puts("I/0,error when reading!");
	else if (feof(pfr))
		puts("End of File!");

	fclose(pfr);
	pfr = NULL;
	fclose(pfw);
	pfw = NULL;
	return 1;
}

文件缓冲区

  • ANSIC标准采用“缓冲文件系统”处理数据文件的;
  • 缓冲文件系统,是指系统自动地在内存中为程序中每个正在使用的文件开辟一块“文件缓冲区”;
  • 从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上;
  • 从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区,充满缓冲区后在逐个地将数据送到程序数据区;
  • 缓冲区的大小根据C编译器系统决定的;

#include <stdio.h>
#include <Windows.h>
int main()
{
	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		perror("pf");
		return 0;
	}
	//将代码写入输出缓存区
	fputc('a', pf);
	//睡眠10s,文件内并未写入内容
	Sleep(10000);
	//刷新缓存区
	fflush(pf);
	//睡眠10s,文件内已写入内容
	Sleep(10000);

	//关闭文件也会刷新缓存区
	fclose(pf);
	pf = NULL;
	return 1;
}

三,案例

机械转行java自学经历,零基础学java,血泪总结的干货 机械转行java自学经历,零基础学java,血泪总结的干货 据说,再恩爱的夫妻,一生中都有100次想离婚的念头和50次想掐死对方的冲动。 求职路上亦是如此,打开这篇文章,相信你也有转行的想法。和身边的朋友聊过,入职后的他们,或多或少对现在的职位都有些不满,都有过转行的冲动。 可他们只是想,而我真的这样做了。 下面就介绍下我转行的血泪史。 我为什么要转行 高中复读了一年,考了个双非院校的机械。当时... 阅读详情

相关推荐

没基础的大学生如何自学c语言 ?

史上最强C语言学习大全,多亏我足够无耻,才从公司六位C语言程序员口中问出方法来。 没错。 这篇文章总结于我们公司六位使用C语言作为开发语言的程序员前辈,方方面面近三千五百字。 C语言具有高效、灵活、功能丰富、表达力强和较高的可移植性等特点,在程序设计中备受青睐。真的太多人学也有太多要学的东西了,以至于后台总有人问C语言该怎么学,甚至还有具体问编程问题的。 乘此机会,整理C语言程序员的从入门到精通之路,分享一下这么多年来我们公司C语言程序员的学习心得。 为了这篇文章,我是费尽口舌,软磨硬泡收集到信息之后,又花

BinSTD的博客 2426

课后习题10-5

#include <stdio.h> struct student { char num[10]; char name[8]; int score[3]; float ave; } stu[3]; int main() { int i, j, sum; FILE *fp; for (i = 0; i < 3; i++) { printf(“input:”); printf(“NO.”); scanf("%s", stu[i].num); printf(“name:”); scanf("%s

weixin_43943137的博客 736

下载Python3.10的相关方法及问题解决

下载Python3.10的相关方法及问题解决 报错unable to locate package python3.10-dev以及subprocess.CalledProcessError: Command ‘(‘lsb_release‘, ‘-a‘)‘ returned non-zero exit status 1问题解决

Istil 1555

使用结构体输出学生成绩

使用结构体输出学生成绩 例:输入学生成绩和信息,然后输出最高分学生信息。 #include<stdio.h> struct student { int number; char name[20]; float score[3]; float sum; }s[3]; int main() { int i,k; float max=0; printf("请输入学生: 学号 姓名 分数1 分数2 分数3\n"); for(i=0;i<3;i++) { printf("%d

he30837993的博客 8099

Unity简单操作:PostProcessing的使用

Postprocessing是一个unity2018版本的集成后期插件,有了这个插件,之后用unity开发时,后期调整颜色、光晕等会很方便。 目录 新建一个postprocessing profile(配置文件)。​ 参数说明: 新建一个postprocessing profile(配置文件)。 在主相机下加一个组件PostProcess Layer。 注意:需要将相机的Layer层设置与Post Process Layer 下的Volume blending(体积混合)...

weixin_39114763的博客 7366

Vivado SDK中LWIP库版本冲突与RTL8211FDI兼容性实战解析

本文深入解析Vivado 2019.1 SDK中LWIP 1.0库与RTL8211FDI千兆PHY芯片的版本冲突问题,并提供实战解决方案。通过手动移植高版本LWIP库、整合第三方驱动及优化BSP配置,有效解决了以太网通信兼容性问题,确保千兆性能稳定运行。

ios99的博客 272

结构体:输出成绩

【代码】结构体:输出成绩。

2303_80050865的博客 603

PyMuPDF`库实现PDF旋转功能

本文介绍了一个简单的Python应用程序,用于将PDF文件转换为旋转90度的PDF文件。通过使用`wx很抱歉,Markdown格式在当前聊天界面无法显示。我将为您提供纯文本格式的博客内容,您可以将其复制到Markdown编辑器中进行格式化。PDF转换工具本文介绍了一个简单的Python应用程序,用于将PDF文件转换为旋转90度的PDF文件。该工具使用了wxPython和PyMuPDF库。功能该PDF转换工具具有以下功能:1. 选择PDF文件:通过点击“选择文件”按钮,用户可以选择要转换的PDF文件。

Winfredzhang的博客 2734

关于浮点型数据在printf函数中的输出方式

前段时间在学习C语言的时候遇到了一些当时无法解释的奇怪问题,这里说一下具体的解决过程。 大家先看一下这段代码: int main() { float num = 1.000000; printf("%#x----%d",num,num); printf("%d----%#x",num,num); return 0; ...

qq_42296985的博客 1万+

数字蓝牙功放

数字蓝牙功放(TPA3110+BK8000L),基于D类数字功放芯片TPA3116蓝牙功放,HIFI级带滤波15Wx2蓝牙数字功放,支持有线和蓝牙两种音源输入

runweipa的博客 1419

OneNet平台MQTT连接避坑指南:C语言Token计算实战(附完整代码)

本文详细解析了OneNet平台MQTT连接中的Token计算机制,提供了C语言实现的完整代码和实战指南。通过HMAC算法和Base64编码,开发者可以高效生成安全凭证,避免常见连接问题,适用于物联网设备开发。

weixin_29193359的博客 460

完全自学C(干货) —— C简介

C介绍

NapoleonCoder的博客 2343

ZYNQ PS裸机开发RS485

RS485 是一种通用的通信标准,广泛用于数据采集和控制应用中。它的主要优点之一是它允许将多个 RS485 设备放在同一条总线上,这使得多个节点可以相互连接。RS-485是美国电子工业协会(EIA)在1983年批准了一个新的平衡传输标准(balanced transmission standard),EIA一开始将RS(Recommended Standard)做为标准的前缀,不过后来为了便于识别标准的来源,已将RS改为EIA/TIA。

baidu_34971492的博客 830

手把手教你如何自学计算机,绝对的干货满满!!!

a. 自我介绍; 在下姓赵,编程萌新,现大一,非计算机专业新生,第一次接触并学习C语言是大一上学期,学习一段时间后尝试写 b. 编程目标; c. 如何学习编程; d. 在学习编程上每周花费多少时间; e. 我最想进入的一家IT公司; ...

qq_56847032的博客 3万+

AUTOSAR CP R18-10 架构总览与导航

AUTOSAR CP R18-10 架构总览 本文档系统整理了AUTOSAR CP R18-10版本的199篇技术规范,涵盖7大架构层级: 应用层(15篇):包含车身舒适、底盘控制、HMI、安全系统、动力系统等AI应用 RTE(1篇):虚拟功能总线规范 服务层(159篇):细分为系统服务(OS/ECU管理/加密)、存储服务、通信服务(CAN/LIN/Ethernet) ECU抽象层(20篇):I/O与通信硬件抽象 MCAL(41篇):微控制器驱动层 复杂驱动(14篇):CDD设计与SPAL支撑 规范模板(2

一名留德华的,康德的信徒的,专注于汽车电子领域的博客 717

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

30个珍藏的程序员超实用自学网站,干货!

有朋友问我平时都是在哪里自学的呢?大学四年以来我收藏了各种学习网站今天一次性分享给大家,一起学习! 一、视频类自学网站 1.哔哩哔哩 自学观看各种教程视频,比较推荐B站,各个领域极其全面。 网址:https://www.bilibili.com/ 2.慕课网 这个网站也是比较常用的,有各种实用的教程,如果你想快速入门一种语言的话,可以到这看看。 网址:https://www.imooc.com...

zag666的博客 3万+

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

完全自学C(干货) —— 编译与链接

编译与链接,预处理指令;

NapoleonCoder的博客 1203

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

完全自学C(干货) —— 函数

即子程序,是大型程序中某部分代码,由一个或多个语句块组成,通常被集成为软件库;

NapoleonCoder的博客 380

完全自学C(干货) —— 预处理详解

预处理;

NapoleonCoder的博客 941

完全自学C(干货) —— 常量、变量

常量:不能改变的量,在程序的运行过程中,不能变化的量; 变量:能被改变的量,在程序的运行过程中,可能会改变或者被赋值的量;

NapoleonCoder的博客 366

完全自学C(干货) —— 数组

一组相同类型元素的集合,可存储一系列相同类型的数据;

NapoleonCoder的博客 1153

【方法分享】准大学生如何自学C语言?

准大学生如何自学C语言 文章目录准大学生如何自学C语言一、找寻一个优质教学视频二、使用优质编译器三、安排一个电子笔记需不需要一个ipad来辅助学习?结语 虽说现在已经接近我们最长的且无忧无虑的暑假的尾声 但我估摸着很多小伙伴还是和我一样整天摸鱼,不知不觉就浪费了一天 (其实只有我在摸鱼对吗,流下了不争气的泪水) 不扯这些没用的,进入今天的正题 本篇博客和大家分享一下我是如何自学C语言的,以及如何做学习笔记 学习方法各不相同,请以自身情况为准 一、找寻一个优质教学视频 好的教学资源永远是我们学习的第一步 在这

慕雪华年的博客 3178

0基础Java自学之路

前言 最近逛知乎的时候,经常看到有人在问“0基础如何自学Java”、“干了几年**,想转行干Java靠谱吗”等问题。不禁让我回想起了自己当初自学Java的日子,因此在这个周末花了点时间,整理了这篇文章,希望对这些正打算自学Java的或者打算转行Java的人有点帮助。 我的自学之路 先告诉你们我的自学过程可能让你们有点参考。 大三的时候,班主任请了2个已经拿到offer的实验室同学来跟...

程序员囧辉 3万+

给自学编程的少年们的一点小干货

适合自学的同学的干货      注意关键字,自学,整天上网看教程视频的,右上角,谢谢。     喜欢编程的和自学能力强的,其实根本不用去网上看所谓的教学视频,书籍,前辈们的经验,都可以看看, 当然我并不是说我自己有很强的自学能力,因为嘛,当初学C语言的时候,书上说入门到精通,只要21天,可是 我用了两个月也只能写个图书管理系统,(PS:现在才学了3个月,说我没能

AA_XB_AA的博客 454

完全自学C(干货) —— 第一个C代码

编译器:Visual Studio 2019

NapoleonCoder的博客 519
上一篇: 完全自学C(干货) —— 动态内存管理
下一篇: 完全自学C(干货) —— 编译与链接
挨代码
博客等级 码龄5年 1696粉丝 384原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值