为何说是从零开始呢,只要是学计算机的都会学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);

}