为什么说是从零开始呢,只要是学计算机的都会学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循环。具体代码如下:
InBlock.gif#include <stdio.h>  
InBlock.gif  
InBlock.gif void main()  
InBlock.gif{  
InBlock.gif           char s[255];  
InBlock.gif           int i;  
InBlock.gif           int bytesNumber;  
InBlock.gif          FILE  *fp;  
InBlock.gif          fp=fopen( "/proc/net/dev""r");     //选择读取的文件 r 以只读方式打开 
InBlock.gif          fgets(s, 255, fp);          
InBlock.gif          printf( "%s\n", s);                       //跳过第一行 
InBlock.gif          fgets(s, 255, fp);             
InBlock.gif          printf( "%s\n", s);                        //跳过第二行 
InBlock.gif          fgets(s, 255, fp);        
InBlock.gif          printf( "%s\n", s);               
InBlock.gif          printf( "now read bytes:", s);         //说明从第三行开始读       
InBlock.gif          fscanf(fp,  "%s", s);  
InBlock.gif          fscanf(fp,  "%d", &bytesNumber);       //输出bytes 这个数 
InBlock.gif          printf( "bytes is %d", bytesNumber);          
InBlock.gif 
InBlock.gif                for( i=1; i<=9; i++) {                   //for 循环从1开始到9结束 
InBlock.gif              
InBlock.gif              fscanf(fp,  "%d", &bytesNumber);       
InBlock.gif          }  
InBlock.gif          printf( "\tAnother bytes is %d\n", bytesNumber);                              
InBlock.gif          fgets(s, 255, fp);              
InBlock.gif            
InBlock.gif          printf( "Read complete.\n");           //说明结束       
InBlock.gif          fclose(fp);                                 //关闭文件读取 
InBlock.gif        } 

 
 
这样可以输出文本文件里的二个数组。从第三行1开始输出,到第9列结束。
 
这个脚本是在linux下测试的保存方式为:test.c 
运行方式为:gcc -wall -o test test.c 
在不报错的情况可以生成test文件
#./test 运行这个文件就可以输出你想看到的信息了。
 
花了我一天的时间,总算是完成了,对于高手来说,实在是太简单,谁让我从零开始呢。
明天继续写c socket 的用法。现在还没有明白呢。努力吧。
 
11月28日更新: 上面那段代码进行了修改.代码如下:
 
InBlock.gif void myread( char *buff)  
InBlock.gif{  
InBlock.gif char buf[1024];  
InBlock.gifFILE *fp;  
InBlock.giffp = fopen( "/proc/net/dev""r");  
InBlock.gif if(!fp)  
InBlock.gif{  
InBlock.gifperror( "fopen");  
InBlock.gifexit(2);  
InBlock.gif}  
InBlock.giffgets(buf, 1024, fp);  
InBlock.giffgets(buf, 1024, fp);  
InBlock.giffgets(buf, 1024, fp);  
InBlock.giffgets(buf, 1024, fp);  
InBlock.giffscanf(fp,  "%s", buf);  
InBlock.gifsnprintf(buff, 100,  "%s", buf);  
InBlock.gif  
InBlock.giffclose(fp);  
InBlock.gifprintf( "%s\n", buf);  
InBlock.gif}
本文转自守住每一天51CTO博客,原文链接:http://blog.51cto.com/liuyu/64073,如需转载请自行联系原作者