一、 C语言文件的操作

1、 文件操作的基本方法:

C语言将计算机的输入输出设备都看作是文件。例如,键盘文件、屏幕文件等.

#include.h>

int main()

{

printf("HelloWorld! \\n");

}

从键盘接收一个字符串然后显示是

#include.h>

int main()

{

char a[10];

scanf("%s",&a);

printf("%s \\n",a);

}

那么,如果写一个字符串到一个文件中,是什么方式呢?显示到屏幕上是默认的输出文件,如果是硬盘中的一个文件,首先要打开一个文件,然后才能往里写,那么就要告诉程序这个文件在什么地方,按照什么样的方式打开(读、写、读和写、添加、覆盖等),然后打开后要给这个打开的文件一个符号(指针变量),表示后续的读和写都是针对这个文件的,而不是到屏幕的,这个指针变量以后就代表了文件自身了。

定义一个代表文件的符号(指针变量)这样的形式

FILE *fp;

其中FILE是固定的写法,后面的是指针变量名,可以随意起。

这个时候fp还是一个空的指针变量,什么也没有代表,类似一个仓库里的货架的标签,什么也没有写。

然后让这个指针变量指向一个文件,就是打开一个文件,然后让这个指针变量指向这个打开的文件,后续对这个指针变量的操作就都是对这个文件的操作了。

打开文件的语句是

fopen(文件位置,打开模式);

文件位置好理解,就是文件所在的位置,例如c://test.txt

打开模式有几种,

r(read): 读

w(write): 写

a(append): 追加

t(text): 文本文件,可省略不写

b(banary): 二进制文件

+: 读和写

一般是rt+,也可以写成r+,和w+,就是读和写,能保留原来的内容。

所以打开C盘下my目录中的文件c:\\my\\test.txt的语句是

fp=fopen("c://my/test.txt","r+");

注意文件夹符号同上面的不同。

这个时候如果打开的文件出问题的话,往一个空指针里面写东西是比较危险的,很容易把系统弄崩溃了。所以在后续的读写操作前,最好测试一下,打开文件后这个文件指针fp是否还是空的,如果是空的话,就不能往下执行了。所以语句变成了这样

if((fp=fopen(" c://my/test.txt ","r+")) == NULL)

{

printf("文件没有正确打开,不能往下执行了. \\n");     

exit(1);

}

完整的程序成了这样

#include.h>

int main()

{

FILE *fp;

if((fp=fopen("c://my/test.txt","r+"))==NULL)

{

printf("文件没有正确打开,不能往下执行了. \\n");

return(1);

}

}

你会看到,程序报错,因为没有my这个目录,所以你要在C盘下先建立一个my目录,然后建立一个test.txt文件。或者你打开方式选择写和读,如果没有目录或者文件的话,程序会自动帮你建一个文件。就是这样

if((fp=fopen("c://my/test.txt","w+"))==NULL)

有时间自己可以百度一下C语言打开文件的类型,功能非常丰富。

然后就可以用前面的输入和输出语句,向文件中写内容了,同咱们上学期学的是一致的,就是在printf和scanf前面加f,成为fprint和fscanf,表示向文件输出和从文件输入,不是向屏幕输出和从键盘输入。

下面的程序实现了从键盘输入一个字符,然后写到文件中。

#include.h>

int main()

{

char a[20];

char b[20];

printf("请输入一个字符串(小于20个字符),写到c://my/test.txt中 \\n");

scanf("%s",&a);

FILE *fp;

if((fp=fopen("c://my/test.txt","w+"))==NULL)

{

printf("文件没有正确打开,不能往下执行了. \\n");

return(1);

}

fprintf(fp,"%s",a);

fclose(fp);

}

执行完后,你打开文件看看,你写的字符是否写进去了?

然后,你在记事本中在文件中写一个字符串,例如你的名字,然后用fscanf读出来,而不用在屏幕上输入了。

#include.h>

int main()

{

char a[20];

FILE *fp;

if((fp=fopen("c://my/test.txt","r+"))==NULL)

{

printf("文件没有正确打开,不能往下执行了. \\n");

return(1);

}

fscanf(fp,"%s",&a);

printf("%s \\n",a);

fclose(fp);

}

读取文件的时候有个指针,保证按照顺序依次往下读,如果读到头了想从头再来,类似看书一页页读完了想到头上重新操作,用函数rewind(fp)就可以了,如果想定位到某个位置,类似将书翻到某一页,用fseek(fp,偏移量,基准),就是在基准(0代表文件头,1代表当前位置,2代表文件尾)的基础上便宜多少。

这就是基本的文件的读写语句。有了文件的读写后,才能进行管理系统的开发,因为你的很多信息要存放到文件中才行,否则在程序中,关机后数据就没有了。

2、 函数的应用和结构化程序设计

如果没有班级的话,咱们全校学生在一个班里面,可以想象管理会多么混乱。咱们想了一个办法,把同学按照专业分到不用的班级中,这样管理起来就方便多了,系里发通知等,只发到班长就行了,由班长向下传达,班级内部更改活动内容,也跟其他班级没有关系,自己关起门来修改就可以了。所以程序也是这样,如果是把所有的代码都放到一起,那跟全校所有的同学都在一个班级一样,互相之间相互联系,程序代码短还没有什么问题,程序代码量一多了,将非常难管理。所以按照功能,将不同的代码放到一起,用大括号括起来,然后给这段代码起个名字表示,类似咱们班级的名字,然后还要设置上参数,一遍使用这个函数的时候向里传递实际的值,类似一个加法的函数,完成两个数的相加,我们可以写成

myadd(int a, int b)

{

int c;

c=a+b;

return c;

}

myadd就是我们给这个函数起的名字,以便使用,a和b的作用接收调用者传递过来的数,然后把接收的两个数相加后返回,这个函数的值在调用后就是返回的值c,所以如果我们想算99+23等于多少,只要调用我们写好的函数

myadd(99,23),这个时候函数的值就是99+23了,如果把结果保存在变量d中,可以写成

d=myadd(99,23);

有了函数,我们就可以把不同功能的代码组织到一起,不仅自己方便,而且程序特别简单明了,便于修改,其他人写的函数我们还可以直接拿来用。

所以我们的这个学生信息管理系统形式就非常简单了,一共用到了三个函数

int main()

{

int i,sum;

pagedis();

check();

menu();

}

第一个是显示欢迎页面,第二个是验证用户名和口令,第三个是显示菜单,并根据用户的输入选择执行相应的操作。

还有一些其他的函数,分别是menu()菜单函数调用的子函数。

结构话程序后大概的形式就是这样

#include.h>

void pagedis();

void check();

void menu();

int main()

{

pagedis();

check();

menu();

}

void pagedis(){

printf("我是显示欢迎界面的模块,具体内容还要再完善! \\n");

}

void check(){

printf("我是验证用户合法性的模块,具体内容还要再完善! \\n");

}

void menu(){

printf("我是引导用户执行各个功能的模块,具体内容还要再完善! \\n");

}

这就是结构化程序设计,把功能放到函数中,下一步就可以集中精力,完善函数中的内容。

以下为学生个人修改的宿舍信息管理系统的源代码

#include"stdio.h"

#include"stdlib.h"

#include"string.h"

#include"conio.h"

#define PAGE 3

#define MAX 1000

#define N 5

int k=0;

/*结构体类型*/

typedef struct

{   int num;/*学号*/

char name[20];/*姓名*/

char sex[5];/*性别*/

int age;/*年龄*/

char studentclass[20];/*班级*/

int dorm;/*宿舍号*/

}STUDENTS;

int read_file(STUDENTS stu[])

{FILE *fp;

int i=0;

if((fp=fopen("stu.txt","rt"))==NULL)

{printf("\n\n*****库存文件不存在!请创");

return 0;

}

while(feof(fp)!=1)

{

fread(&stu[i],sizeof(STUDENTS),1,fp);

if(stu[i].num==0)

break;

else

i++;

}

fclose(fp);

return i;

}

void save_file(STUDENTS stu[],int sum)

{FILE*fp;

int i;

if((fp=fopen("stu.txt","wb"))==NULL)

{printf("写文件错误!\n");

return;

}

for(i=0;i<sum;i++)

if(fwrite(&stu[i],sizeof(STUDENTS),1,fp)!=1)

printf("写文件错误!\n");

fclose(fp);

}

/*创建学生信息*/

int input(STUDENTS stu[])

{  int i,x;

for(i=0;i<1000;i++)

{

system("cls");

printf("\n\n                 录入学生信息  (最多%d个)\n",MAX);

printf("               ----------------------------\n");

printf("\n                     第%d个学生",k+1);

printf("\n 请输入学生的学号:");

scanf("%d",&stu[k].num);

printf("\n 请输入学生的姓名:");

scanf("%s",stu[k].name);

printf("\n 请输入学生的性别:");

scanf("%s",stu[k].sex);

printf("\n 请输入学生的年龄:");

scanf("%d",&stu[k].age);

printf("\n 请输入学生的班级:");

scanf("%s",stu[k].studentclass);

printf("\n 请输入学生的宿舍号:");

scanf("%d",&stu[k++].dorm);

printf("\n 请按1键返回菜单或按0键继续创建");

scanf("%d",&x);

if(x)

break;

}

return k;

}

/*删除学生信息*/

void deletel(STUDENTS stu[])

{ system("cls");

char Stuname2[20];

int i,j;

printf("请输入学生姓名:");

scanf("%s",Stuname2);

printf("\n");

for(i=0;i<k;i++)

if(strcmp(stu[i].name,Stuname2)==0)

for(j=0;j<20;j++)

stu[i].name[j]=stu[i+1].name[j];

k--;

printf("删除成功\n");

printf("按任意键加回车返回主菜单!");

scanf("%d",&i);

getchar();

}

/*打印学生信息*/

void output(STUDENTS stu[])

{  system("cls");

int i;

for(i=0;i<k;i++)

printf("学号:%d,姓名:%s,性别:%s,年龄:%d,班级:%s,宿舍号: %d\n",stu[i].num,stu[i].name,

stu[i].sex,stu[i].age,stu[i].studentclass,stu[i].dorm);

printf("按任意键加回车返回主菜单!");

scanf("%d",&i);

getchar();

}

/*查询学生信息*/

void inquire(STUDENTS stu[])

{ int i;

int num;

system("cls");

printf("     \n\n请输入您要查找的学生的学号");

scanf("%d",&num);

for(i=0;i<k;i++)

if(num==stu[i].num)

printf("\n\n\n学号:%d,姓名:%s,性别:%s,年龄:%d,班级:%s,宿舍号: %d\n",stu[i].num,stu[i].name,

stu[i].sex,stu[i].age,stu[i].studentclass,stu[i].dorm);

printf("按任意键加回车返回主菜单!");

scanf("%d",&i);

getchar();

}

/*修改学生信息*/

void change(STUDENTS stu[])

{  int num,i,choice;

system("cls");

printf("\n\n\n      请输入您要修改的学生的学号");

scanf("%d",&num);

for(i=0;i<k;i++)

{ if(num==stu[i].num)

printf("\n学号:%d,姓名:%s,性别:%s,年龄:%d,班级:%s,宿舍号: %d\n",stu[i].num,stu[i].name,

stu[i].sex,stu[i].age,stu[i].studentclass,stu[i].dorm);

printf("\n\n\n     ********请输入您想要修改的数据********\n\n");

printf("                1. 学号\n\n");

printf("                2. 姓名\n\n");

printf("                3. 性别\n\n");

printf("                4. 年龄\n\n");

printf("                5. 班级\n\n");

printf("                6. 宿舍号\n\n");

printf("                 请选择(1-6):");

scanf("%d",&choice);

switch(choice)

{case 1:{

printf("\n   请输入你改的新学号");

scanf("%d",&stu[i].num);

break;

}

case 2:{

printf("\n   请输入你改的新姓名");

scanf("%s",stu[i].name);

break;

}

case 3:{

printf("\n   请输入你改的新性别");

scanf("%s",stu[i].sex);

break;

}

case 4:{

printf("\n   请输入你改的新年龄");

scanf("%d",&stu[i].age);

break;

}

case 5:{

printf("\n   请输入你改的新班级");

scanf("%s",stu[i].studentclass);

break;

}

case 6:{

printf("\n   请输入你改的新宿舍");

scanf("%d",&stu[i].dorm);

break;

}

}

printf("学号:%d,姓名:%s,性别:%s,年龄:%d,班级:%s,宿舍号: %d\n",stu[i].num,stu[i].name,

stu[i].sex,stu[i].age,stu[i].studentclass,stu[i].dorm);

printf("按任意键加回车返回主菜单!");

scanf("%d",&i);

break;

}

}

/*学生宿舍信息统计*/

void sort(STUDENTS stu[])

{  int i,j,n=1,x;

system("cls");

int t;

for(i=0;i<k-1;i++)

for(j=i+1;j<k;j++)

if(stu[i].dorm<stu[j].dorm)

{ t=stu[i].dorm;

stu[i].dorm=stu[j].dorm;

stu[j].dorm=t;

t=stu[i].num;

stu[i].num=stu[j].num;

stu[j].num=t;

}

for(i=0;i<k;i++)

printf("顺序    学号    宿舍\n %d       %d       %d\n",n++,stu[i].num,stu[i].dorm);

printf("按任意键加回车返回主菜单!");

scanf("%d",&x);

getchar();

}

void pagedis()

{

printf(" \n\n\n                   **********************************\n");

printf("                   *                                *\n");

printf("                   *                                *\n");

printf("                   *                                *\n");

printf("                   *  欢迎进入学生宿舍信息管理系统  *\n");

printf("                   *                                *\n");

printf("                   *                                *\n");

printf("                   *                                *\n");

printf("                   **********************************\n");

}

void check()

{

char userName[5];/*用户名*/

char userPWD[5];/*密码*/

int i,sum;

system("color 4E");

for(i = 1; i < 4; i++)

{

/*用户名和密码均为123;*/

printf("   用户名和密码均为123\n\n");

printf("\n       请输入您的用户名:");

gets(userName);

printf("\n       请输入您的密码:");

gets(userPWD);

if ((strcmp(userName,"123")==0) && (strcmp(userPWD,"123")==0))/*验证用户名和密码*/

{

printf("用户名和密码正确,显示主菜单");

return;

}

else

{

if (i < 3)

{

printf("用户名或密码错误,提示用户重新输入");

printf("用户名或密码错误,请重新输入!");

}

else

{

printf("连续3次输错用户名或密码,退出系统。");

printf("您已连续3次将用户名或密码输错,系统将退出!");

exit(1);

}

}

}

}

void menu()

{

STUDENTS stu[20];

int choice,k,sum;

sum=read_file(stu);

if(sum==0)

{  printf("首先录入基本库存信息!按回车后进入*****\n");

getch();

sum=input(stu);

}

do

{  system("cls");

printf("\n\n\n               ********学生信息管理系统********\n\n");

printf("                      1. 创建学生信息\n\n");

printf("                      2. 打印学生信息\n\n");

printf("                      3. 查询学生信息\n\n");

printf("                      4. 修改学生信息\n\n");

printf("                      5. 删除学生信息\n\n");

printf("                      6. 学生宿舍信息顺序\n\n");

printf("                      0. 退出系统\n\n");

printf("                       请选择(0-6):");

scanf("%d",&choice);

switch(choice)

{

case 1: k=input(stu); break;/*创建学生信息*/

case 2: output( stu) ; break;/*打印学生信息*/

case 3: inquire(stu); break;/*查询学生信息*/

case 4: change(stu); break;/*修改学生信息*/

case 5: deletel(stu); break;/*删除学生信息*/

case 6: sort(stu); break;/*学生宿舍信息顺序*/

case 0: break;

}

}while(choice!=0);

save_file(stu,sum);

}

int main()

{

int i,sum;

pagedis();

check();

menu();

}

第二课作业(刘萌150206318)相关推荐

  1. 汇编语言第二课作业-实验1

    Debug命令-摘自百度百科 A 汇编命令 功能: 将指令直接汇编成机器码输入到内存中. 说明: 用于小段程序的汇编及修改目标程序,所有输入的数字均采用十六进制, 用户装入内存的汇编语句是连续存放的, ...

  2. 汇编语言第二课作业2.1

    1.计算 mov    ax,62627         ax=F4A3H mov    ah,31H            ax=31A3H mov    al,23H             ax ...

  3. 汇编语言第二课作业2.3

    执行下面3条指令后,CPU几次修改IP,什么时候,IP的值是多少? MOV    ax,bx    修改一次,IP=0003H SUB      ax,ax    修改一次,IP=0006H JMP  ...

  4. 刘萌150206318

    本节内容是为了就C语言的指针,链表原理和各项操作的阐述所撰写:对于C语言我感到既熟悉的同时也感到一丝胆怯:C语言是一门很有趣,又可以说是枯燥的一门学科,但是今天的学习,让我学习到了许多. 指针是一个地 ...

  5. 「数据结构」普林斯顿算法课第二周作业

    「数据结构」普林斯顿算法课第二周作业 Algorithm I, Princeton 编程作业: Deques and Randomized Queues 思路 Deque.java Randomize ...

  6. 【Web编程实践课第二次作业】体育新闻世界

    夢に敗れた幼き人 被梦想打败的幼稚的人 憧れたヒーローには 是无法变成自己 成れやしないんだ 所憧憬的英雄的 現実に叩き起された時 被现实叫醒的时候 理想郷は離れて 理想的桃花源便会离去 崩れ落ちてき ...

  7. 交通大学c语言作业,交通大学C语言第二次作业说课讲解.docx

    交通大学C语言第二次作业 题目1 正确 满分1.00 标记题目 题干 对于传值调用(By Value)的描述,哪一个正确?(?????) 选择一项: a.?实际参数和形式参数共占相同的内存位置 b.? ...

  8. 丁贵才130702010042第二次作业

    第二次作业 2.9 设有如下语句,请用相应的谓词公式分别把它们表示出来: (1)有的人喜欢梅花,有的人喜欢菊花,有的人既喜欢梅花有喜欢梅花. 解:定义谓词 P(x):x是人 L(x,y):x喜欢y y ...

  9. 湘潭大学信息安全课作业答案7

    湘潭大学信息安全课作业答案7 教师:李澄清院长 整理自助好心的助教大哥-申哥. 1. Do gENtleMnE rEad Not GeNtLeme'ns otHer maIl gGtlNmenE Do ...

最新文章

  1. 一个很好的Qt教程个人主页
  2. VC:隐藏CTabCtrl标签按钮
  3. CVPR2019最全整理:全部论文下载,Github源码汇总、直播视频、论文解读等
  4. 【测试点三、四、五分析】1032 Sharing (25 分)_28行代码AC
  5. python一次删除多个键值对_Python单击:多个键值对参数
  6. 下载安装vs2019详细版
  7. oracle分页的三种方式,oracle 使用rownum的三种分页方式
  8. Splash广告界面
  9. 如何用 30 行代码实现微信自动回复机器人?
  10. Doom启示录(三)------李乃峰所崇拜之 两个约翰!
  11. 对飞猪H5端API接口sign签名逆向实验
  12. Live555实时视频流应用总结
  13. 京东手机评论数据集介绍
  14. 重整旗鼓学java之java基础
  15. 龙门标局:注册地理标志证明商标有什么作用
  16. 北斗导航公共服务平台首次落户四川
  17. word之插入图表题、表标题,图目录和表目录
  18. 面试通过后如何拒绝HR拿offer
  19. 知识付费直播间的实用售课技巧
  20. pyhton学习之找出单词的个数并进行排序

热门文章

  1. 电信增值业务学习笔记7——USSD增值业务提供技术
  2. 计算机考试ks文件夹,大学计算机考试PPT Word Excel都关了 但是装他们的文件夹KS没关 就提交了有事吗......
  3. Wake、场库、桔多多等应用被通报下架,涉及三七互娱、新片场
  4. ShardingProxy插入Emoji表情报错
  5. 父类卡子类卡java,Java 问答:终极父类(三)——finalize()和 getClass()
  6. Python多进程写日志ConcurrentLogHandler
  7. 亲情通天下的网络电话 能否真正热起来
  8. 2019 上海小学组 题目解析
  9. 关于选择器权重导致的a:hover 失效问题
  10. Dubbo注册流程分析