/*
函数作用及解释。
fopen:
FILE* fopen(const char *filename,const char *mode)
filename-要打开的文件名,mode-文件访问模式
"r"只读,
"w"创建一个用于写入的空文件,如果文件名称与已经存在的文件相同,则会删除已有的文件的内容,
文件被视为一个新的空文件。
"a"追加到一个文件,写操作向文件末尾追加数据,如果文件不存在,则创建文件。
"r+"打开一个用于更新的文件,可读取也可写入,该文件必须存在。
"w+"创建一个用于读写的空文件。
"a+"打开一个用于读取和追加的文件。
返回值为一个FILE指针。否则返回NULL,且设置全局变量errno来标识错误。
fscanf:分局数据格式从输入流(stream)中写入数据(argument);
返回值,整型,成功返回读入的参数的个数,失败返回EOF(-1);
fgets:fscanf遇到空格和换行时结束,fgets遇到空格不结束。
fclose:关闭流stream,刷新所有的缓冲区。如果流关闭成功,则该方法返回零。如果失败,则返回EOF。
perror(const char *str):把一个描述性错误消息输出到stderr。输出str:错误类型.
**counter.txt
1001 ewa 30 234560
1002 rose 31 3234546
1003 joe 24 325256
1004 jack 39 5412545
*/
示例:
#include
#include
#include
typedef struct User{
int usercounter;
char username[24];
int age;
int money;
}user_t; //类型别名
int loadUser(user_t user[])//载入函数,参数为user_t类型的结构体指针
{
FILE* fp = fopen("counter.txt","r");//以只读的方式打开文件
if(fp == NULL){
perror("打开失败");
exit(1);
}
int i = 0;
while(fscanf(fp,"%d %s %d %d",&user[i].usercounter,&user[i].username,&user[i].age,
&user[i].money)>0){
i++;
}
fclose(fp);
return i;
}
void sortUser(user_t user[],int len)//按姓名排序
{
int i=0,j=0;
for(i=0;ifor(j=0;j if(strcmp(user[j].username,user[j+1].username)>0){
user_t tmp =user[j];
user[j]=user[j+1];
user[j+1]=tmp;
}
}
}
return;
}
void printUser(user_t user[],int len)//打印所有人员信息
{
int i = 0;
for(i=0;iprintf("counter:%d name:%s age:%d money:%d\n",user[i].usercounter,user[i].username,user[i].age,user[i].money);
}
}
int main(void)
{
user_t user[24];
memset(user,0,sizeof(user));
int len = loadUser(user);
sortUser(user,len);
printUser(user,len);
return 0;
}
閱讀更多 1991不再來 的文章