首先先声明自己也是个新手,写这个时候也是仿照了别人的博客
参考lordly_cm的博客
首先说一下,自己写完这个小程序之后的心得吧!
- 终于把自己学的东西用上了,感到很开心
- 就是知道了,如何把数据存储在文件中,还有就是怎么在程序中加载之前已经存在的信息
- 认识到了关于文件的重要性
在摆上代码之前,还是要先介绍两个重要的函数,fwrite,fread,想必大家都了解,但是还是写一下吧,主要是复习一下
fwrite函数
size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream)
这里面的buffer,是一个指针,就是你要写入的东西的指针,
size,就是一次写入的大小,stream,就是你要写入的文件的指针
关于size_t类型,大家还是看一下百度链接吧size_t
fread函数
和上面的fwrite很类似
size_t fread ( void *buffer, size_t size, size_t count, FILE *stream)
这里类似,只是buffer是要从文件中写入的指针,stream是读取的文件指针
foef函数
int foef( fp )
判断文件是否读取完毕,如果读取完毕返回非零值,否则返回零值
下面是文件的代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
typedef struct person
{
char num[ 15 ];
char name[ 20 ];
char age[ 3 ] ;
float English ;
float special ;
}person;
person per[ 100 ];
char * load_file( )
{
char * filename;
filename = ( char * )malloc( sizeof( char )*100 );
filename = "c:\\users\\陈豪杰\\desktop\\学籍管理文件.txt";
return filename;
}
void logon()//设置登陆函数,在后期还可以添加密码功能
{
printf( "\n\n\n\t\t\t 学生学籍管理系统\n\n" );
printf( "\n\n\n\t\t\t 2019.2.9\n\n" );
printf( "\t\t\t 6栋313\n" );
printf( "\n\n\n\t\t\t able\n" );
system( "pause" );
}
int menu_select( ) //选择需要实现的功能
{
int flag ;
do{
system( "cls" );
printf( "\t\t***************\n" );
printf( "\t\t_________________\n" );
printf( "\t\t | 1. 添加纪录 | 2.显示记录\n\n" );
printf( "\t\t | 3. 信息查询 | 4.数据计算\n\n" );
printf( "\t\t | 5. 修改记录 | 6.删除记录\n\n" );
printf( "\t\t | 7. 退出系统 \n\n" );
printf( "\t\t***************\n" );
printf( "\t\t_________________\n" );
printf( "\t\t 请输入你想执行的操作的标号:" );
scanf( "%d", &flag );
}while( flag<1 || flag>7 );
return flag;
}
/*
完成学生信息的录入工作
*/
void add( char * filename )
{
FILE * fp;
int i = 0 , n = 0 ;
char sign = 'y'; //这里可以使用do-while循环,不用提前赋值;
system( "cls" );
while( sign != 'n' && sign != 'N' )
{
printf( "\t\t------学生信息的添加----\n\n" );
printf( "学号:\n" );
scanf( "%s" , per[i].num );
printf( "姓名:\n" );
scanf( "%s", per[i].name );
printf( "年龄:\n" );
scanf( "%s", &per[i].age );
printf( "英语:\n" );
scanf( "%f", &per[i].English );
printf( "专业:\n" );
scanf( "%f", &per[i].special );
printf( "是否继续添加Y/N:" );
scanf( "\n%c", &sign );
i++;
n++;
system( "cls" );
}
if( ( fp = fopen( filename , "a" )) == NULL )
{
printf( "no sourse file\n" );
system( "pause" );
return ;
}
for( i=0 ; i<n ; i++ )
if( fwrite( &per[i], sizeof( person ) ,1, fp ) != 1 )
printf( "file write error\n" );
fclose( fp );
system( "pause" );
}
void show( person per_special )
{
printf( "\t学号:%s\n" , per_special.num );
printf( "\t姓名:%s\n" ,per_special.name );
printf( "\t年龄:%s\n" , per_special.age );
printf( "\t英语: %f\n" ,per_special.English );
printf( "\t专业: %f\n" , per_special.special );
printf( "\n" );
}
/*
学生信息浏览
*/
void scan( char * filename )
{
char sign = 'y';
FILE * fp;
int i = 0 , n;
system( "cls" );
if( ( fp = fopen( filename , "r" ) ) == NULL )
{
printf( "open file error\n" );
system( "pause" );
return ;
}
while( !feof( fp ) )//feof( fp )为判断是否读取到文件尾的函数判断
{
fread( &per[ i ], sizeof( person ) , 1 , fp );
i++;
}
fclose( fp );
printf( "**********************************\
********************************\n" );
printf( "\t学号\t\t姓名\t年龄\t英语\t专业\n" );
printf( "**********************************\
********************************\n" );
for( n=0 ; n<i ; n++ )
{
printf( "\t%s\t%s\t%s\t%f\t%f",per[ n ].num,
per[ n ].name,per[ n ].age,per[ n ].English,per[ n ].special );
printf( "\n" );
}
system( "pause" );
}
/*
模糊查询
*/
int * fuzzy( person * per , int n )
{
char s[ 3 ]; //一个汉字是占据两个字节的,使用三个字节是为了末尾的结束标志。
int i = 0 , t = 0 , * result ;
result = ( int *)malloc( sizeof( int ) * 100 );
system( "cls" );
printf( "请输入你想要查询的姓:" );
scanf( "%s",s );
for( i = 0 ; i < n ; i++ )
if( per[ i ].name[ 0 ] == s[ 0 ] && per[ i ].name[ 1 ] == s[ 1 ] )
{
show( per[ i ] );
result[ t ] = i ;
t++;
}
if( t == 0 )
printf( "没有这个姓的同学\n" );
*( result+t ) = -1;
return result ;
}
/*
按照名字查询
*/
int * name_order( person * per , int n )
{
char s[ 20 ];
int i = 0 , * result , t = 0 ;
result = ( int *)malloc( sizeof( int ) * 100 );
printf( "请输入查询的姓名:" );
scanf( "%s" , s );
for( ; i < n ; i++ )
if( strcmp( per[ i ].name , s ) == 0 )
{
show( per[ i ] );
result[ t ] = i;
t++;
}
if( t == 0 )
printf( "没有这个名字的同学\n" );
*( result+t ) = -1;
return result ;
}
/*
按照学号进行查询
*/
int * num_order( person * per , int n )
{
char s[ 20 ] ;
int i = 0 , * result, t = 0 ;
result = ( int *)malloc( sizeof( int ) * 100 );
printf( "请输入查询的学号:" );
scanf( "%s" , s );
for( ; i < n ; i++ )
if( strcmp( per[ i ].num , s ) == 0 )
{
show( per[ i ] );
result[ t ] = i;
t++;
}
if( t == 0 )
printf( "没有这个学号的同学\n" );
*( result+t ) = -1;
return result ;
}
/*
学生信息查询
可以分为不同的方式进行查询
*/
void query( char * filename )
{
FILE * fp ;
int i = 0 , n = 0 , m ;
system( "cls" );
printf( "\t^^^^^^^^^^^^^^^^^^^\n" );
printf( "\t|1--模糊查询 |\n" );
printf( "\t|2--姓名 |\n" );
printf( "\t|3--学号 |\n" );
printf( "\t|4--返回 |\n" );
printf( "\t^^^^^^^^^^^^^^^^^^^\n" );
printf( "请输入你要的查询方式: " );
scanf( "%d",&m );
while( m!=1 && m!=2 && m!=3 && m!=4 )
{
printf( "方式错误,请重新选择方式: " );
scanf( "%d" , &m ) ;
}
if( ( fp = fopen( filename , "r" ) )== NULL )
{
printf( "cannot open the file\n" );
system( "pause" );
return ;
}
/*
先将所有的数据都储存在数组中,
方便后面的操作
*/
while( !feof( fp ) )
{
fread( &per[ i ] , sizeof( person ), 1 , fp );
i++ ;
n++ ;
}
fclose( fp ) ;
/*
判断选择查询的方式
*/
switch( m )
{
case 1: fuzzy( per , n ); break;
case 2: name_order( per , n ); break;
case 3: num_order( per , n ); break;
case 4: menu_select( ); break;
}
}
/*
按照英语成绩逆序排名
*/
void english_order( person * temp , int n )
{
int i , order[ 100 ] , t , k ;
for( i = 0 ; i < n ; i++ )
{
order[ i ] = i ;
}
for( i = 0 ; i < n ; i++ )
{
for( t= 0 ; t < n-i-1 ; t++ )
{
if( temp[ order[ t ] ].English > temp[ order[ t+1 ] ].English )
{
k = order[ t ];
order[ t ] = order[ t+1 ];
order[ t+1 ] = k;
}
}
}
for( i = 0 ; i < n ; i++ )
{
show( temp[ order[ i ] ] );
}
}
/*
按照专业成绩逆序排名
*/
void special_order( person * temp , int n )
{
int i , order[ 100 ] , t , k ;
for( i = 0 ; i < n ; i++ )
{
order[ i ] = i ;
}
for( i = 0 ; i < n ; i++ )
{
for( t= 0 ; t < n-i-1 ; t++ )
{
if( temp[ order[ t ] ].special > temp[ order[ t+1 ] ].special )
{
k = order[ t ];
order[ t ] = order[ t+1 ];
order[ t+1 ] = k;
}
}
}
for( i = 0 ; i < n ; i++ )
{
show( temp[ order[ i ] ] );
}
}
/*
按照总成绩逆序排名
*/
void total_order( person * temp , int n )
{
int sum[ 100 ] , order[ 100 ] , i = 0 , k ,t ;
for( ; i < n ; i++ )
sum[ i ] = temp[ i ].English + temp[ i ].special ;
for( i = 0 ; i < n ; i++ )
{
order[ i ] = i ;
}
for( i = 0 ; i < n ; i++ )
for( t = 0 ; t < n-i ; t++ )
{
if( sum[ order[ t ] ] > sum[ order[ t+1 ] ] )
{
k = order[ t ];
order[ t ] = order[ t+1 ];
order[ t+1 ] = k;
}
}
for( i = 0 ; i < n ; i++ )
{
show( temp[ order[ i ] ] );
}
}
/*
数据排名
*/
void score_order( char * filename , int flag )
{
FILE * fp;
person temp[ 100 ] ;
int n = 0 , order[ 100 ] , Max_position = 0 ;
if( ( fp = fopen( filename, "r" ) ) == NULL )
{
printf( "cannot open the file" );
return ;
}
while( !feof( fp ) )
{
fread( &temp[ n ] , sizeof( person ) , 1 , fp );
n++;
}
n--;
switch( flag )
{
case 1:english_order( temp , n ) ; break ;
case 2:special_order( temp , n ) ; break ;
case 3:total_order( temp , n ); break ;
}
}
/*
数据计算
*/
void data( char * filename )
{
FILE * fp ;
int sum , s[ 100 ] ,flag;
system( "cls" );
printf( "\t|1-----英语\n" );
printf( "\t|2-----专业\n" );
printf( "\t|3-----总分\n" );
printf( "\t|4-----返回\n" );
printf( "\t请输入你想要选择的排序方式:" );
scanf( "%d",&flag );
system( "cls" );
switch( flag )
{
case 1: score_order( filename , 1 );break;
case 2: score_order( filename , 2 ); break;
case 3: score_order( filename , 3 ); break;
case 4: menu_select( ) ;break;
}
}
/*
修改学生数据
*/
void amend( char * filename )
{
FILE * fp;
person temp[ 100 ];
int i = 0 , n = 0 , * result , flag ;
result = ( int *)malloc( sizeof( int ) * 100 );
result[ 0 ] = -1 ;
if( ( fp = fopen( filename , "r" ) ) == NULL )
{
printf( "cannot open the file" );
return ;
}
while( !feof( fp ) )
{
fread( &temp[ n ] , sizeof( person ) , 1 , fp );
n++;
}
n--;
fclose( fp );
system( "cls" );
printf( "\t^^^^^^^^^^^^^^^^^^^\n" );
printf( "\t|1--姓名 |\n" );
printf( "\t|2--学号 |\n" );
printf( "\t|3--返回 |\n" );
printf( "请输入你要的查询方式: " );
scanf( "%d", &flag );
switch( flag )
{
case 1: result = name_order( temp , n ); break;
case 2: result = num_order( temp , n ); break;
case 3: break;
}
if( result[ 0 ] == -1 )
return ;
else
{
for( ; *( result+i )!=-1 ; i++ )
{
printf( "学号:\n" );
scanf( "%s" , temp[ result[ i ] ].num );
printf( "姓名:\n" );
scanf( "%s", temp[ result[ i ] ].name );
printf( "年龄:\n" );
scanf( "%s", &temp[ result[ i ] ].age );
printf( "英语:\n" );
scanf( "%f", &temp[ result[ i ] ].English );
printf( "专业:\n" );
scanf( "%f", &temp[ result[ i ] ].special );
}
if( ( fp = fopen( filename , "w" ) ) == NULL )
{
printf( "cannot open the file" );
return ;
}
for( i=0 ; i<n ; i++ )
if( fwrite( &temp[i], sizeof( person ) ,1, fp ) != 1 )
printf( "file write error\n" );
fclose( fp );
printf( "修改完成" );
}
}
/*
删除学生数据
*/
void del( char * filename )
{
FILE * fp;
person temp[ 100 ];
int i = 0 , n = 0 , * result , flag ,test[ 100 ] , k ;
char decision;
result = ( int *)malloc( sizeof( int ) * 100 );
result[ 0 ] = -1 ;
if( ( fp = fopen( filename , "r" ) ) == NULL )
{
printf( "cannot open the file" );
return ;
}
while( !feof( fp ) )
{
fread( &temp[ n ] , sizeof( person ) , 1 , fp );
n++;
}
n--;
fclose( fp );
for( ; i <= n ; i++ ) //便于后面的删除操作
test[ i ] = i ;
system( "cls" );
printf( "\t^^^^^^^^^^^^^^^^^^^\n" );
printf( "\t|1--姓名 |\n" );
printf( "\t|2--学号 |\n" );
printf( "\t|3--返回 |\n" );
printf( "请输入你要的查询方式: " );
scanf( "%d", &flag );
switch( flag )
{
case 1: result = name_order( temp , n ); break;
case 2: result = num_order( temp , n ); break;
case 3: break;
}
if( result[ 0 ] == -1 )
return ;
else
{
for( i = 0 ; *( result+i )!=-1 ; i++ )
{
show( temp[ result[ i ] ] );
printf( "是否删除Y/N?: " );
scanf( "\n%c", &decision );
if( decision == 'Y' || decision == 'y' )
{
if( ( fp = fopen( filename , "w" ) ) == NULL )
{
printf( "cannot open the file\n" );
return ;
}
for( k = 0 ; k <= n-1 ; k++ )
{
if( k == *( result+i ) )
continue;
fwrite( &temp[ test[ k ] ] , sizeof( person ) , 1 , fp );
}
fclose( fp );
printf( "删除完成" );
}
}
}
}
void main()
{
char * filename;
filename = load_file( );
int n = 0;
logon();
for( ; ; )
{
switch( menu_select( ) )
{
case 1: add( filename ); break;
case 2: scan( filename ); break;
case 3: query( filename ); break;
case 4: data( filename ); break;
case 5: amend( filename ); break;
case 6: del( filename ); break;
case 7: exit( 1 );
}
system( "pause" );
};
}
因为是第一次写这种较多的代码,存在的bug挺多的,欢迎大家多多指正啊!