Unix/Linux编程实践教程 笔记一

来源:互联网 发布:微信运动数据更新时间 编辑:程序博客网 时间:2024/06/11 09:37

自己动手编写Linux中 more命令

第一版 more01.c

#include <stdio.h>#include <stdlib.h>#define PAGELEN 24#define LINELEN 512void do_more(FILE *);int see_more();int main(int ac, char *av[]){  FILE *fp;  if(ac == 1)    do_more(stdin);  else    while(--ac)    if((fp = fopen(* ++av,"r")) != NULL)    {      do_more(fp);      fclose(fp);    }    else    {      exit(1);    }  return 0;}void do_more(FILE *fp){ char line[LINELEN]; int num_of_lines = 0; int reply; while(fgets( line ,LINELEN , fp))   {     if(num_of_lines == PAGELEN)       {         reply = see_more();         if(reply == 0)           break;         num_of_lines -= reply;       }     if(fputs(line,stdout) == EOF)       exit(1);     num_of_lines++;   }}int see_more(){ int c; printf("\033[7m more? \033[m"); while((c = getchar()) != EOF) {  if(c == 'q')    return 0;  if(c == ' ')    return PAGELEN;  if(c == '\n')    return 1; } return 0;}

收获

      1.FILE * fopen(const char * path,const char * mode);

返回值:文件顺利打开后,指向该流的文件指针就会被返回。如果文件打开失败则返回NULL,并把错误代码存在errno中。
一般而言,打开文件后会做一些文件读取或写入的动作,若打开文件失败,接下来的读写动作也无法顺利进行,所以一般在fopen()后作错误判断及处理。
参数说明:
参数path字符串包含欲打开的文件路径及文件名(字符串常量,字符数组),参数mode字符串则代表着流形态("r"只读,"r+"读写)。
2.int fclose( FILE *fp );
返回值:如果流成功关闭,fclose 返回 0,否则返回EOF(-1)。(如果流为NULL,而且程序可以继续执行,fclose设定error number给EINVAL,并返回EOF。)功能是关闭一个流。
注意:使用fclose()函数就可以把缓冲区内最后剩余的数据输出到内核缓冲区,并释放文件指针和有关的缓冲区。


3.函数原型char *fgets(char *buf, int bufsize, FILE *stream);

参数

*buf: 字符型指针,指向用来存储所得数据的地址。

bufsize: 整型数据,指明存储数据的大小。*

stream: 文件结构体指针,将要读取的文件流。


返回值

  1. a.成功,则返回第一个参数buf;
  2. b.在读字符时遇到end-of-file,则eof指示器被设置,如果还没读入任何字符就遇到这种情况,则buf保持原来的内容,返回NULL;
  3. c.如果发生读入错误,error指示器被设置,返回NULL,buf的值可能被改变。
  从文件结构体指针stream中读取数据,每次读取一行。读取的数据保存在buf指向的字符数组中,每次最多读取bufsize-1个字符      (第bufsize个 字符        赋'\0'),如果文件中的该行,不足bufsize个字符,则读完该行就结束。如若该行(包括最后一个换行          符)    的字符数超过bufsize-1,则fgets只       返回一个不完整的行,但是,缓冲区总是以NULL字符结尾,对fgets的下一次        调用会继续读该行。函数成功将返回buf,失败或读到文件结尾返          回NULL。因此我们不能直接通过fgets的返回值来判断函      数是否是出错而终止的,应该借助feof函数或者ferror函数来判断。
功能 标准输出设备刷清?

      4.int fputs(str,fp)
  str是字符型指针 fp是文件型指针
  fputs是一种函数,具有的功能是向指定的文件写入一个字符串(不自动写入字符串结束标记符‘\0’)。成功写入一个字符串后,文件的位置指针会自动后移,函数返回值为非负整数;否则返回EOF(符号常量,其值为-1)。
         详细代码示例代码见 Ubuntu day_06 filetest

5.字符常量在内存中占4个字节,存放的是字符的ASCII码(整型数据)
 c语言规定所有字符常量都作为整型量来处理
在c中,char,int可通用

6.LInux下 编译c 命令 gcc -o more01 more01.c
                  执行命令 ./more01
0 0