/*給的sex[2]好像裝不下4個字母。 。 。 。 。 。不過題意明白了。
**為了簡化編程,我把結構體裡的資料都改成字元數組了,如果需要數字的話,再加一步轉換**就好了,比較簡單就不寫了,另外程序中用了個結構體數組,如果無法確定檔案中到底有多**少行,為了節約內存,可以用動態分配的方式。寫得比較倉促,也沒封裝函數,不過確實**可用,將會就著看吧~~~
*/
#include <...>
struct employ
{
char id[10];
char name[10];
char sex[5];
char age[5];
char edu[10];
char wage[5];
char address[20];
char number[20];
};
int _tmain(int argc, _TCHAR* argv[])
{
char buf[100];
FILE* pf=NULL;
struct employ Ep[10]={};
int flag=0;
pf=fopen("employ.dat","r");
if(!pf)
{
printf("檔案開啟失敗!\n");
system("pause");
return -1;
}
while(fgets(buf,99,pf))
{
char* pchar=buf;
for(int i=0;i
{
Ep[flag].id[i]=*pchar;
if(*pchar ==',')
break;
}
for(int i=0;i
{
Ep[flag].name[i]=*pchar;
if(*pchar ==',')
break;
}
for(int i=0;i
{
Ep[flag].sex[i]=*pchar;
#if(*pchar ==',')
break;
}
for(int i=0;i
{
Ep[flag].age[i]=*pchar;
if(*pchar ==',')
break;
}
for(int i=0;i
{
Ep[flag].edu[i]=*pchar;
if(*pchar ==',')
break;
}
for(int i=0;i
{
Ep[flag].wage[i]=*pchar;
#if(*pchar ==',')
break;
}
for(int i=0;i
{
Ep[flag].address[i]=*pchar;
if(*pchar ==',')
break;
}
for(int i=0;i
{
Ep[flag].number[i]=*pchar;
#if(!*pchar )
break;
}
//printf("%s",buf);
flag;
}
fclose(pf);
system("pause");
return 0;
}
使用fopen,fscanf函數可以實現從txt檔案當中讀取內容,進行簡單操作。
1.fopen的函數原型:FILE * fopen(const char * path,const char * mode);
fopen函數的第一個參數是檔案路徑,第二個參數是開啟方式,有以下幾種方式:
r 以唯讀方式開啟文件,該文件必須存在。
r 以可讀寫方式開啟文件,該文件必須存在。
rb 讀寫開啟一個二進位文件,允許讀取資料。
rw 讀寫開啟一個文字文件,允許讀和寫。
w 開啟只寫文件,若文件存在則文件長度清除為0,即該文件內容會消失。若文件不存在則建立該文件。
w 開啟可讀寫文件,若文件存在則文件長度清除為零,即該文件內容會消失。若文件不存在則建立該文件。
a 以附加的方式開啟只寫檔案。若文件不存在,則會建立該文件,如果文件存在,寫入的資料會被加到文件尾,即文件原先的內容會被保留。 (EOF符保留)
a 以附加方式開啟可讀寫的檔案。若文件不存在,則會建立該文件,如果文件存在,寫入的資料會被加到文件尾後,即文件原先的內容會被保留。 (原來的EOF符不保留)
wb 只寫開啟或新建一個二進位;只允許寫入資料。
wb 讀寫開啟或建立一個二進位文件,允許讀取和寫入。
wt 讀寫開啟或著建立一個文字檔;允許讀寫。
at 讀寫開啟一個文字文件,允許讀取或在文字末端追加資料。
ab 讀寫開啟一個二進位文件,允許讀取或在文件末端追加資料。
上述的形態字串都可以再加一個b字符,如rb、w b或ab 等組合,加入b 字符用來告訴函數庫打開的文件為二進位文件,而非純文字文件。
傳回值:檔案順利開啟後,指向該流的檔案指標就會被傳回。如果檔案開啟失敗則回傳NULL,並且把錯誤代碼存在errno中。
2.例程:
1
2
3
4
5
6
7
8
9
10
11
12
#include
#define F_PATH "d:\\myfile\\file.dat"
#charc;
intmain(){
FILE*fp=NULL;//需要注意
fp=fopen(F_PATH,"r");
if(NULL==fp) return-1;//要回傳錯誤代碼
while(fscanf(fp,"%c",&c)!=EOF) printf("%c",c); //從文字中讀入並在控制台列印出來
fclose(fp);
fp=NULL;//需要指向空,否則會指向原始開啟檔案位址
return0;
}
最簡單的方法,就是一行一行的讀,但只取你要的那一行資料就行了。下面是我寫的一個簡單的例子,抽了三次獎,沒有判重複的。
#include
#include
#include
#define PEOPLE_NUM 10 //我的檔案裡有10個名字
void get_prize(FILE* fp, char prize_name[])
{
int num;
int i;
fseek(fp, 0, SEEK_SET);
printf("start...\n");
num = rand() % PEOPLE_NUM 1;
for(i = 0; i
{
fgets(prize_name, 32, fp);
}
printf("%s get the prize!!!\n", prize_name);
}
int main()
{
FILE* fp = fopen("name.txt", "r");
int prize_num;
int i;
char prize_name[32] = {0};
srand(time(0));
for(i = 0; i
{
printf("\n");
get_prize(fp, prize_name);
}
fclose(fp);
return 0;
}檔案是這個樣子:
#運行截圖:
#寫這種程式你存名字的檔案一定要排整齊,這樣程式才好處理。祝好運。
以上是C語言如何將檔案的資料賦值給結構體的變量的詳細內容。更多資訊請關注PHP中文網其他相關文章!