期末项目篇:C语言文件操作

星落化尘 2023-12-10 16:19:33

原本是没打算写这个篇章的,因为这个内容用的特别的少,忘记的很快,学起来可能两分钟就好了,就几条指令

1.基础操作

学会基础操作其实就差不多了,但是下面的内容也可以看看

下面这两个表格写代码的时候可以看看,考试前可以看看(我也不记得会不会考),不一定要回背

文件的使用
使用方式作用 如果文件不存在
"r"(只读)为了输入数据,打开一个已经存在的文本文件
出错         
"w"(只写)为了输出数据,打开一个文本文件建立一个新的文件
"a"(追加)向文本文件添加数据建立一个新的文件
"rb"(只读)为了输入数据,打开一个二进制文件
出错
"wb"(只写)为了输出数据,打开一个二进制文件
建立一个新的文件
"ab"(追加)向一个二进制文件尾添加数据
出错
"r+"(读写)
为了读和写,打开一个文本文件
出错
"w+"(读写)
为了读和写,建立一个新的文本文件
建立一个新的文件
"a+"(读写)
打开一个文本文件,在文件尾进行读写
建立一个文件
"rb+"(读写)
为了读和写,打开一个二进制文件
出错
"wb+"(读写)为了读和写,建立一个新的二进制文件
建立一个新的文件
"ab+"(读写)打开一个二进制文件,在文件尾进行读写建立一个新的文件
多敲了一行删不掉 
文件的顺序读写
函数名功能适用性
fgetc(file)字符输入函数所有输入流
fputc(char,file)字符输出函数所有输出流
fgets(char[] arr,int size,file)文本行输入函数所有输入流
fputs(char[] arr,file)文本行输出函数(覆盖原本内容)所有输出流
fscanf()格式化输入函数所有输入流(多用于结构体的输入)
fprintf()格式化输出函数所有输出流(多用于结构体的输出)
fread()二进制输入文件
fwrite()二进制输出文件

主要是把理解上面两个表格,下面写一下用法

示例代码:(只是示例代码,正常写的话对一个文件只会有写操作或是读操作,一般是不会两个一起写的!!!)

#include<stdio.h>
#include<string.h>
#include<errno.h>

typedef struct S
{
	char name[10];
	int age;
 
}Peo;
 
int main()
{
    //打开文件
	FILE* pf= fopen("test.txt", "w+");

    //fgetc(): 读入一个字符
    char ch = fgetc(pf);

    //fputc(): 输入一个字符
    fputc('a', pf);
    
	
	//fgets(): 读入指定个数的字符串
    char arr[10] = { 0 };
	fgets(arr, 5, pf); 

    //fputs(): 输入一行字符串(会覆盖)
    fputs("hello world", pf);

    //fscanf(): 输入数据,原先指定格式,后面读入数据就方便
    Peo p = { 0 };
	fscanf(pf, "%s %d", p.name, &p.age);
    
    //fprintf(): 读入数据并进行封装
    Peo p = { "zhangsan", 18 };
	fprintf(pf, "%s %d\n", p.name, p.age);
    

	//用完关闭文件
	fclose(pf);
	pf = NULL;
 
	return 0;
}

2. 期末项目(菜单功能)

那么我们通过一个示例来进一步了解该如何写一个学生成绩管理系统菜单及数据存储功能

剩下的功能就靠大家课后自己实现啦

知识点:switch,system函数,多文件程序,文件的输入和输出

大家看的时候就学一学思路就好了,文件操作的代码比较乱,因为学长用的是visual studio写的,这个软件不用C++报错很离谱,代码全是各种查api查出来的

main.cpp(主函数)

//多文件引用
#include "student.h"
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void insertStudent() {
	S student;
	getchar();
	printf("请输入学生姓名:\n");
	fgets(student.name,sizeof(student.name), stdin);
	printf("请输入学生成绩:\n");
	scanf_s("%d", &student.grade);
	addStudent(student);
}
void printStudent() {
	int num = 0;
	S* students = getStudents(&num);
	for (int i = 0; i < num; i++) {
		printf("%s %d\n", students[i].name, students[i].grade);
	}
	system("pause");
}

int main() {
	int chance;
	while (true) {
		//清屏
		system("cls");

		printf("欢迎使用XXXX学生成绩管理系统!\n");
		printf("请根据以下选项选择您需要的服务:\n");
		printf("1. 查询全部成绩\n");
		printf("2. 插入成绩\n");
		printf("0. 退出系统\n");
		scanf_s("%d", &chance);
		switch (chance)
		{
		case 1:
			printStudent();
			break;
		case 2:
			insertStudent();
			break;
		case 0:
			return 0;
		default:
			printf("请输入正确的选择\n");
			//暂停
			system("pause");
			break;
		}
	}
}

 

student.h(工具类的头文件)

#include<stdio.h>
#include<string.h>
#include<errno.h>
#include<stdlib.h>
//定义一个学生类(面向对象的思想)
typedef struct student {
	//只是做个演示,所以就只写了两个属性,你们自己写可以多加几个属性
	//比如学号、年龄、学科什么的
	//因为是大伙的期末作业,学长有自己的期末作业 QAQ
	char name[100];
	int grade;
}S;

S* getStudents(int* num);

void addStudent(S student);

student.cpp(工具类的实现类)

#include "student.h"


S* getStudents(int* num)
{
	FILE* filePtr = (FILE*)malloc(sizeof(FILE));
	FILE** pf = &filePtr;
	fopen_s(pf, "test.txt", "r+");
	S students[1000];
	int cnt = 0;
	if (*pf == NULL) return NULL;
	while (fscanf_s(*pf, "%s %d", students[cnt].name, sizeof(students[cnt].name), &students[cnt].grade) != EOF) {
		cnt++;
		(*num)++;
	}
	fclose(*pf);
	*pf = NULL;
	return students;
}

void addStudent(S student)
{
	//vs写这个东西很奇怪,下面的写法确实很怪
	//因为学长一直都是用C++的,所以C语言也不清楚
	//下面的api写法是查的AI
	//初始化数据----因为数据好像会覆盖,所以我们再把原本的数据读出来再书写新数据
	int num = 0;
	S* students = getStudents(&num);
	//打开文件
	FILE* filePtr = (FILE*)malloc(sizeof(FILE));
	FILE** pf = &filePtr;
	fopen_s(pf, "test.txt", "w+");
	if (*pf == NULL) return;
	for (int i = 0; i < num; i++) {
		fprintf(*pf, "%s %d\n", students[i].name, students[i].grade);
	}
	//插入数据
	fprintf(*pf, "%s %d\n", student.name, student.grade);
	//关闭文件
	fclose(*pf);
	*pf = NULL;
}

这就体现了分模块的作用,如果使用单文件的写法,所有的文件都杂在一起会使文件的后期管理成本上升(只是我们代码目前比较短所以看起来没那么复杂,学长当初的这个系统用C++写的代码也有1000行了)

因为学长用的是w+的写法,其使用起来可能没那么方便,会需要重新读入数据,但是打开txt文件是相对比较容易看懂的

如果想要简化思维上的操作,可以用"ab"的追加写法,但是其书写的文件是比较难看的

3. 总结

文件的书写是比较繁琐的一件事情,他的本地持久化存储的过程是非常接近底层的代码,且数据管理较杂乱,如果之后引入数据库的概念就可以更加轻松的实现数据的持久化。

而多文件程序框架是搭建软件架构的有个重要技术与理念,它能够大大的降低软件后期的开发和维护成本,让你的代码更清晰易懂。

本文涉及的内容比较的少,但是只要掌握了就可以完成期末的项目了,如果同学们想更深入的学习与了解可以在csdn查询其他的博客进行学习。

...全文
104 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
C/C++期末复习资料大汇总 一、内容概述 在本次上传中,我们为您精心整理了关于C/C++的期末复习资料。这些资料涵盖了从基础知识到进阶概念,旨在帮助您全面复习C/C++的相关内容。无论是准备期末考试还是为大作业做准备,这份资料都将为您的学习提供有力的支持。 二、资料详解 基础知识:针对C/C++的语法、数据类型、运算符等内容进行了详细的梳理,帮助您打好扎实的基础。 进阶概念:深入探讨了指针、函数、文件操作等进阶知识点,为您进一步提升编程能力提供指导。 期末复习题及答案:包含各类期末考试的经典题目及详细答案,让您熟悉考试题型,把握考试重点。 期末大作业指南:针对C/C++的期末大作业,提供了从选题到实现的全程指导,帮助您顺利完成作业。 实战案例集锦:收录了一些经典案例,让您在实践中掌握C/C++的应用技巧。 三、适用人群 这份复习资料适用于学习C/C++的各类人群,无论是初学者还是有一定编程基础的学生,都能从中获得收益。 四、使用建议 我们建议您先从基础知识开始复习,逐步深入到进阶概念。在掌握基本知识点后,结合复习题进行巩固练习,最后通过大作业和实战案例进一步提升自己的编程能力。 五、特别提示 为了更好地掌握C/C++的知识点,除了复习资料外,实际操作和练习也是非常关键的。希望这份资料能帮助您取得优异的成绩,也欢迎您在学习过程中提出宝贵的意见和建议。 最后,感谢您选择我们的复习资料,祝您学习顺利!
C/C++期末复习资料大汇总 一、内容概述 在本次上传中,我们为您精心整理了关于C/C++的期末复习资料。这些资料涵盖了从基础知识到进阶概念,旨在帮助您全面复习C/C++的相关内容。无论是准备期末考试还是为大作业做准备,这份资料都将为您的学习提供有力的支持。 二、资料详解 基础知识:针对C/C++的语法、数据类型、运算符等内容进行了详细的梳理,帮助您打好扎实的基础。 进阶概念:深入探讨了指针、函数、文件操作等进阶知识点,为您进一步提升编程能力提供指导。 期末复习题及答案:包含各类期末考试的经典题目及详细答案,让您熟悉考试题型,把握考试重点。 期末大作业指南:针对C/C++的期末大作业,提供了从选题到实现的全程指导,帮助您顺利完成作业。 实战案例集锦:收录了一些经典案例,让您在实践中掌握C/C++的应用技巧。 三、适用人群 这份复习资料适用于学习C/C++的各类人群,无论是初学者还是有一定编程基础的学生,都能从中获得收益。 四、使用建议 我们建议您先从基础知识开始复习,逐步深入到进阶概念。在掌握基本知识点后,结合复习题进行巩固练习,最后通过大作业和实战案例进一步提升自己的编程能力。 五、特别提示 为了更好地掌握C/C++的知识点,除了复习资料外,实际操作和练习也是非常关键的。希望这份资料能帮助您取得优异的成绩,也欢迎您在学习过程中提出宝贵的意见和建议。 最后,感谢您选择我们的复习资料,祝您学习顺利!

212

社区成员

发帖
与我相关
我的任务
社区描述
程序设计基础课程教学群
c语言c++ 高校 福建省·厦门市
社区管理员
  • xmzq001
  • 鹿饮涧鸣
  • jiangxiaoju
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

请加入学习社区的软件23级同学修改社区昵称为学号+姓名,以便登记作业提交情况。

试试用AI创作助手写篇文章吧