/*
函數作用及解釋。
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不再來 的文章