爲何說是從零開始呢,只要是學計算機的都會學C,但那是學校的事了,我都還給老師了。老師對不住啊。您白教我位學生了。
最近開始學習C,緣由:上司讓我用C寫一程序。大致是:經過daemon程序從/proc/net/dev讀取並統計流量,經過socket鏈接在server上讀取daemon提供的流量信息並顯示,經過gd庫繪製圖形
那麼首先是解決 daemon 這個在WIN和LINUX是通用的,網上特別多的資料,我在這裏就不寫了。(daemon是守護進程)
如何從/proc/net/dev 中讀取數據呢?首先要判斷文件是什麼類型的,有文本文件,二進制文件,我這裏的文件是文本文件。
用到的C 函數fgets fopen fclose
fgets 的具體用法爲:
fgets(由文件中讀取一字符串)
相關函數 open,fread,fscanf,getc
表頭文件 include<stdio.h>
定義函數 har * fgets(char * s,int size,FILE * stream);
函數說明 fgets()用來從參數stream所指的文件內讀入字符並存到參數s所指的內存空間,直到出現換行字符、讀到文件尾或是已讀了size-1個字符爲止,最後會加上NULL做爲字符串結束。
返回值 gets()若成功則返回s指針,返回NULL則表示有錯誤發生。
範例 #include<stdio.h>
main()
{
char s[80];
fputs(fgets(s,80,stdin),stdout);
}
執行 this is a test /*輸入*/
this is a test /*輸出*/
在代碼中我還用到了一個for循環。具體代碼以下:
#include <stdio.h>
void main()
{
char s[255];
int i;
int bytesNumber;
FILE *fp;
fp=fopen(
"/proc/net/dev",
"r");
//選擇讀取的文件 r 以只讀方式打開
fgets(s, 255, fp);
printf(
"%s\n", s);
//跳過第一行
fgets(s, 255, fp);
printf(
"%s\n", s);
//跳過第二行
fgets(s, 255, fp);
printf(
"%s\n", s);
printf(
"now read bytes:", s);
//說明從第三行開始讀
fscanf(fp,
"%s", s);
fscanf(fp,
"%d", &bytesNumber);
//輸出bytes 這個數
printf(
"bytes is %d", bytesNumber);
for( i=1; i<=9; i++) {
//for 循環從1開始到9結束
fscanf(fp,
"%d", &bytesNumber);
}
printf(
"\tAnother bytes is %d\n", bytesNumber);
fgets(s, 255, fp);
printf(
"Read complete.\n");
//說明結束
fclose(fp);
//關閉文件讀取
}
這樣能夠輸出文本文件裏的二個數組。從第三行1開始輸出,到第9列結束。
這個腳本是在linux下測試的保存方式爲:test.c
運行方式爲:gcc -wall -o test test.c
在不報錯的狀況能夠生成test文件
#./test 運行這個文件就能夠輸出你想看到的信息了。
花了我一天的時間,總算是完成了,對於高手來講,實在是太簡單,誰讓我從零開始呢。
明天繼續寫c socket 的用法。如今尚未明白呢。努力吧。
11月28日更新: 上面那段代碼進行了修改.代碼以下:
void myread(
char *buff)
{
char buf[1024];
FILE *fp;
fp = fopen(
"/proc/net/dev",
"r");
if(!fp)
{
perror(
"fopen");
exit(2);
}
fgets(buf, 1024, fp);
fgets(buf, 1024, fp);
fgets(buf, 1024, fp);
fgets(buf, 1024, fp);
fscanf(fp,
"%s", buf);
snprintf(buff, 100,
"%s", buf);
fclose(fp);
printf(
"%s\n", buf);
}