標籤:style blog http color 使用 os io 檔案
曾經解析有規律的檔案的時候要麼用正則表達式,要麼就是傻傻的自己敲代碼來解析有規律的檔案。今天突然發現c的庫函數中有一個現成的能夠解析有規律的檔案的函數,就是fscanf()函數。哎 曾經自己做了這麼多無用功,在這裡具體解析一下fscanf函數:
fscanf()函數(有點像正則表達式):
功 能: 從一個流中運行格式化輸入,fscanf遇到空格和換行時結束,注意空格時也結束。
用 法:int fscanf(FILE *stream, char *format,[argument...]);
int fscanf(檔案指標,格式字串,輸入列表);
for example:
FILE*fp;
chara[10];
intb;
doublec;
fscanf(fp,"%s%d%lf",a,&b,&c)
返回值:整型,數值等於[argument...]的個數
當中的format就是相當於正則表達式中的格式,即用什麼樣的格式來分隔檔案裡的資訊。光說不好理解,一下用一個範例來說明詳細怎麼用:
首先我有一個data。txt的檔案中面的資料格式例如以下:
2,50,41,w,20.585828
4,52,51,r,52.012547
.........................
很多條類似的記錄,都是以,來分隔的
.......................
我實現的功能就是把上面檔案裡的資料的五個欄位賦值給對應的五個變數,而且輸出這些變數的值。實現的程式例如以下:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int fd;
long dev;
long offset;
long length;
char ch;
double ts=0.000000;
if((fd=fopen("/home/haixian/ceshi/data.txt","r"))<0)
{
printf("open the file is error!\n");
exit(0);
}
lseek(fd,0,SEEK_SET);
while(5==fscanf(fd,"%ld,%ld,%ld,%c,%lf\n",&dev,&offset,&length,&ch,&ts))
{在這裡就是第二個參數指定分隔參數的格式,在這裡使用的是,來分隔。這樣就非常easy的擷取了記錄的各個欄位的值並不須要自己編寫函數來進行解析什麼的。
printf("%ld,%ld,%ld,%c,%lf\n",dev,offset,length,ch,ts);
}
close(fd);
return 0;
}
通過上面的範例能非常好的理解fscanf函數的使用方法。曾經自己敲代碼解析這樣的檔案,費力還不討好,得出的結果還不準確。哎 僅僅能感歎我太弱了,以後還得好好學習!!!!