專案忙的最近乙個多月都沒有寫部落格了;
前兩天在做專案時遇到要乙個結構體中的內容格式化的寫進乙個檔案中然後再格式化的讀出來,就可以使用fprintf和fscanf,那麼有個問題就是fprintf寫檔案和fscanf讀檔案時的資料格式必須完全匹配,如果有不相符的地方,那麼就會失敗。而且fscanf對資料的要求很嚴格,他讀到空格或是換行時就會失敗,所以如果將乙個空的字串寫進乙個檔案中,那麼在用fcanf這個字串時就會將這個空格代表的字串後面以及下乙個空格之前的內容給讀出來,所以就會讀的移位了,導致程式異常;
如果你用逗號等作為標誌符來區分的話,遇到有空格的字串的話還是會出現問題;所以總結就是fcanf真難用;
想了個辦法就是用fgets將一行的內容讀到乙個buf中,然後再用sscanf來進行解析,這樣你可以在寫檔案時加上標誌符,在解析檔案時根據這些標誌符來解析進不同的變數中就可以了;
#include #include #include #define snmp_trap_file "trapserver.txt"
typedef struct
trapserverlist_t;
trapserverlist_t trapserverlist[3];
int main(void)
for(k=0; k<3; k++)
ret = fprintf(fptr,"%d ,%s ,%u ,%u ,%s ,%u ,%u\n",
trapserverlist[k].busyindex,
trapserverlist[k].traplistipv4addr,
trapserverlist[k].traplistport,
trapserverlist[k].version_snmp,
trapserverlist[k].community,
trapserverlist[k].timeout,
trapserverlist[k].retries);
printf("in %s(%d):ret[%d]\n", __function__, __line__, ret);
/*ret = fscanf(fptr,"%d %s %u %u %s %u %u\n",
&trapinfo.busyindex,
trapinfo.traplistipv4addr,
&trapinfo.traplistport,
&trapinfo.version_snmp,
trapinfo.community,
&trapinfo.timeout,
&trapinfo.retries);
printf("in %s(%d):ret[%d]\n", __function__, __line__, ret);
printf("in %s(%d):trapinfor.busyindex[%d]\n", __function__, __line__, trapinfo.busyindex);
printf("in %s(%d):trapinfor.traplistipv4addr[%s]\n", __function__, __line__, trapinfo.traplistipv4addr);
printf("in %s(%d):trapinfor.traplistport[%d]\n", __function__, __line__, trapinfo.traplistport);
printf("in %s(%d):trapinfor.version_snmp[%d]\n", __function__, __line__, trapinfo.version_snmp);
printf("in %s(%d):trapinfor.community[%s]\n", __function__, __line__, trapinfo.community);
printf("in %s(%d):trapinfor.timeout[%d]\n", __function__, __line__, trapinfo.timeout);
printf("in %s(%d):trapinfor.retries[%d]\n", __function__, __line__, trapinfo.retries);*/
}fclose(fptr);
fptr = fopen(snmp_trap_file, "r");
if (fptr == null)
for(k=0; k<3; k++)
fclose(fptr);
/*fptr = fopen(snmp_trap_file, "r");
if (fptr == null)
while((fgets(tmp_buf,500,fptr))!=null)
fclose(fptr);*/
return 0;
}
這是我的乙個測試程式,有些亂;不明白為什麼將fscanf放在for裡面就讀失敗了,但是放在外面就可以讀成功,很是納悶; fprintf與stderr stdout的使用
include void main 上面程式編譯成fprint檔案,執行顯示如下 soyo8888can t open it soyo15can t open it soyocan t open it 若將輸入重定向到乙個temp.txt檔案中,執行 fprint temp.txt 結果如下 soy...
fwrite與fprintf的區別
fwrite是向流中寫入資料,而fprintf是向流中寫入格式資料。兩者的共同點為向流中寫入資料,至於區別可以看看兩者的申明 size t fwrite const void buffer,size t size,size t count,file stream int fprintf file s...
fprintf用法詳解
相關函式 printf,fscanf,vfprintf 標頭檔案 include 定義函式 int fprintf file stream,const char format,函式說明 fprintf 會根據引數format 字串來轉換並格式化資料,然後將結果輸出到引數stream 指定的檔案中,直...