1.1Linux系统调用和用户编程接口

1.1.1系统调用

用户程序向操作系统提出请求的接口。不同的系统提供的系统调用接口各不相同。

      继承UNIX系统调用中最基本和最有用的部分。

调用按照功能分:进程控制、进程间通讯、文件系统控制、存储管理、网络管理、套接字控制、用户管理。

1.1.2用户编程接口

实际开发使用的是用户编程接口:

(1)、系统调用接口功能非常简单,无法满足程序的需求。

      (2)、不同操作系统的系统调用接口不兼容,程序移植时工作量大。

1.2Linux标准编程接口

1.2.1标准IO的由来:指的是ANSI C中定义的用于IO操作的一系列函数。

(1)、具有更好的移植性;(2)、可以减少系统调用的次数,提高系统效率(在用户空间创建缓冲区)。

1.2.2流的含义

缓冲类型:(1)、全缓冲;(2)、行缓冲;(3)、无缓冲;

1.3标准IO编程

1.3.1流的打开:

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

1.3.2流的关闭:

        int fclose(FILE *fp);

1.3.3错误处理:

        void perror(const char *s);

 /*******************************************************************
* > File Name: 01-perror.c
* > Author: fly
* > Mail: XXXXXXXX@icode.com
* > Create Time: Tue 29 Aug 2017 10:43:49 PM CST
******************************************************************/ #include <stdio.h> int main(int argc, char* argv[])
{
FILE *fp; //定义一个文件指针 if((fp = fopen("1.txt","r")) == NULL){
perror("Open 1.txt error :"); //输出错误信息
return (-);
}else{
printf("Open 1.txt successed , fp = %p\n", fp);
} fclose(fp); return ;
}

perror.c

        char *strerror(int errnum);

 /*******************************************************************
* > File Name: 01-strerror.c
* > Author: fly
* > Mail: XXXXXXXX@icode.com
* > Create Time: Tue 29 Aug 2017 11:22:07 PM CST
******************************************************************/ #include <stdio.h>
#include <string.h>
#include <errno.h> int main(int argc, char* argv[])
{
FILE *fp; if((fp = fopen("1.txt", "r")) == NULL){
printf("Fopen 1.txt error : %s\n", strerror(errno));
return (-);
} fclose(fp); return ;
}

strerror.c

1.3.4流的读写:

1.按字符(字节)输入/输出

字符输入:

int fgetc(FILE *stream);

int getc(FILE *stream);

           int getchar(void);

字符输出:

int fputc(int c, FILE *stream);

int putc(int c, FILE *stream);

int putchar(int c);

 /*******************************************************************
* > File Name: 03-fput.c
* > Author: fly
* > Mail: XXXXXXXX@icode.com
* > Create Time: Tue 29 Aug 2017 11:51:13 PM CST
******************************************************************/ #include <stdio.h> int main(int argc, char* argv[])
{
int c; while(){
c = fgetc(stdin); //从标准输入流获取一个字符
if((c >= '') && (c <= ''))
fputc(c, stdout); //如输入的是数字,就输出
if(c == '\n'){
puts("");
break; //换行符,跳出循环
}
} return ;
}

fput.c 结合fputc()和fgetc(),循环从标准输入读取任意个字符并将其中的数字输出到标准输出。

2.按行输入/输出

行输入:

char *fgets(char *s, int size, FILE *stream);

char *gets(char *s);

行输出:

int fputs(const char *s, FILE *stream);

int puts(const char *s);

 /*******************************************************************
* > File Name: 04-fgets.c
* > Author: fly
* > Mail: XXXXXXXX@icode.com
* > Create Time: Wed 30 Aug 2017 11:39:05 PM CST
******************************************************************/ #include <stdio.h>
#include <string.h> int main(int argc, char* argv[])
{
static int line = ;
char buf[];
FILE *fp; if(argc < ){
printf("Usage : %s <file> \n", argv[]);
return (-);
} if((fp = fopen(argv[], "r")) == NULL){
perror("Fail to fopen :");
return (-);
} while(fgets(buf, , fp) != NULL){
if(buf[strlen(buf) - ] == '\n')
line++;
} printf("The line of %s is %d\n", argv[], line); return ;
}

fgets.c 计算一个文本文件的行数

3.以指定大小为单位读写文件

          size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

  size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

1.3.5流的定位

          int fseek(FILE *stream, long offset, int whence);

          whence:SEEK_SET,  SEEK_CUR,  or  SEEK_END:文件起始、当前、末尾读写位置;

          long ftell(FILE *stream);

 /*******************************************************************
* > File Name: 05-ftell.c
* > Author: fly
* > Mail: XXXXXXXX@icode.com
* > Create Time: Thu 31 Aug 2017 12:25:37 AM CST
******************************************************************/ #include <stdio.h> int main(int argc, char* argv[])
{
FILE *fp; if(argc < ){
printf("Usage : %s file \n", argv[]);
return (-);
} if((fp = fopen(argv[], "r")) == NULL){
perror("Fail to fopen :");
return (-);
} fseek(fp, , SEEK_END); printf("The size of %s is %ld bytes\n", argv[], ftell(fp)); return ;
}

ftell.c 获取一个文件的大小

1.3.6格式化输入与输出

输入:

int scanf(const char *format, ...);

  int fscanf(FILE *stream, const char *format, ...);

  int sscanf(const char *str, const char *format, ...);

输出:

          int printf(const char *format, ...);

      int fprintf(FILE *stream, const char *format, ...);

    int sprintf(char *str, const char *format, ...);

int snprintf(char *str, size_t size, const char *format, ...);

1.4实验内容

1.4.1文件的复制

1.实验目的:通过实现文件的复制,掌握流的基本操作。

2.实验内容:在程序中分别打开源文件和目标文件。循环从源文件中读取内容并写入目标文件。

3.实验步骤:(1)、检查参数→打开源文件→打开目标文件→循环读写文件→关闭文件。

(2)、编写代码。

 /*******************************************************************
* > File Name: 06-mycopy.c
* > Author: fly
* > Mail: XXXXXXXX@icode.com
* > Create Time: Fri 01 Sep 2017 11:04:46 PM CST
******************************************************************/ #include <stdio.h>
#include <errno.h>
#include <string.h>
#define N 64 #define ENABLE 1
#define DISABLE 0
#define ERR_T_ONE DISABLE
#define ERR_T_TWO DISABLE int main(int argc, char* argv[])
{
char buf[N];
FILE* fps, *fpd;
int n; /*1.判断命令行参数*/
if(argc < ){
fprintf(stderr, "Usage : %s <src_file> <dst_file>\n", argv[]);
return (-);
} /*2.打开源文件*/
if((fps = fopen(argv[], "r")) == NULL){
fprintf(stderr, "Fopen %s error : %s\n", argv[], strerror(errno));
return (-);
} /*3.打开目标文件*/
if((fpd = fopen(argv[], "w")) == NULL){
fprintf(stderr, "Fopen %s error : %s\n", argv[], strerror(errno));
fclose(fps);
return (-);
} /*4.复制文件*/
while((n = fread(buf, , N, fps)) > ){
#if (ERR_T_TWO == ENABLE)
fwrite(buf, , N, fpd); //末尾会多写入11个填充字符
bzero(buf, sizeof(buf));
#elif(ERR_T_ONE == ENABLE)
fwrite(buf, , N, fpd); //多写入最后一次的前一次的最后11个字符
#else
fwrite(buf, , n, fpd);
#endif
} fclose(fps);
fclose(fpd); return ;
}

mycopy.c

1.4.2循环记录系统时间

1.实验目的:获取系统时间→在程序中延时→流的格式化输出。

2.实验内容:程序中每隔一秒读取一次系统时间并写入文件。

3.实验步骤:(1)、设计流程:打开文件→获取系统时间→写入文件→延时1s→返回第二步(获取系统时间)。

(2)、编写代码。

 /*******************************************************************
* > File Name: 07-getTime.c
* > Author: fly
* > Mail: XXXXXXXX@icode.com
* > Create Time: Sat 02 Sep 2017 10:15:07 PM CST
******************************************************************/ #include <stdio.h>
#include <time.h>
#include <string.h>
#include <errno.h>
#include <unistd.h> #define BUF_LENGTH 64 int main(int argc, char* argv[])
{
int n = ;
char buf[BUF_LENGTH];
FILE *fps;
time_t t; /*1.判断命令行参数*/
if(argc < ){
sprintf(buf,"Usage : %s <file_name>\n", argv[]);
printf("%s", buf);
return (-);
} /*2.打开文件*/
if((fps = fopen(argv[], "w")) == NULL){
fprintf(stderr, "Fopen %s error :%s\n", argv[], strerror(errno));
return (-);
} /*2.每隔1秒,获得时间,写入文件,记录下来*/
while(){
n ++;
t = time(NULL);
fprintf(fps, "Good Luck %4d : %s", n, ctime(&t));
fprintf(stdout, "%4d\n", n);
sleep();
fflush(NULL);
} fclose(fps); return ;
}

getTime.c

1.Linux标准IO编程的更多相关文章

  1. linux标准io的copy

    ---恢复内容开始--- 1.linux标准io的copy #include<stdio.h> int main(int argc,char **argv) { if(argc<3) ...

  2. Linux标准IO和管道

    Linux标准IO和管道 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.标准输入和输出 程序:指令+数据 读入数据:Input 输出数据:Output 打开的文件都有一个fd: ...

  3. linux标准IO缓冲(apue)

    为什么需要标准IO缓冲? LINUX用缓冲的地方遍地可见,不管是硬件.内核还是应用程序,内核里有页高速缓冲,内存高速缓冲,硬件更不用说的L1,L2 cache,应用程序更是多的数不清,基本写的好的软件 ...

  4. 2.Linux文件IO编程

    2.1Linux文件IO概述 2.1.0POSIX规范 POSIX:(Portable Operating System Interface)可移植操作系统接口规范. 由IEEE制定,是为了提高UNI ...

  5. Linux 标准IO库介绍

    1.标准IO和文件IO有什么区别? (1).看起来使用时都是函数,但是:标准IO是C库函数,而文件IO是Linux系统的API. (2).C语言库函数是由API封装而来的.库函数内部也是通过调用API ...

  6. [Linux]标准IO全缓冲和行缓冲

    概述 标准IO中,标准错误是不带缓冲的.若是指向终端设备的流才是行缓冲的,否则是全缓冲的. 行缓冲也可以分配缓冲区,当遇到超大行(超过缓冲区的行),缓冲区内容也会优先刷出. 示例 #include & ...

  7. linux 标准io笔记

    三种缓冲 1.全缓冲:在缓冲区写满时输出到指定的输出端. 比如对磁盘上的文件进行读写通常是全缓冲的. 2.行缓冲:在遇到'\n'时输出到指定的输出端. 比如标准输入和标准输出就是行缓冲, 回车后就会进 ...

  8. 为什么需要标准IO缓冲?

    (转)标准I/O缓冲:全缓冲.行缓冲.无缓冲 标准I/O库提供缓冲的目的是尽可能地减少使用read和write调用的次数.它也对每个I/O流自动地进行缓冲管理,从而避免了应用程序需要考虑这一点所带来的 ...

  9. 【linux草鞋应用编程系列】_1_ 开篇_系统调用IO接口与标准IO接口

    最近学习linux系统下的应用编程,参考书籍是那本称为神书的<Unix环境高级编程>,个人感觉神书不是写给草鞋看的,而是 写给大神看的,如果没有一定的基础那么看这本书可能会感到有些头重脚轻 ...

随机推荐

  1. Java多线程系列四——控制线程执行顺序

    假设有线程1/线程2/线程3,线程3必须在线程1/线程2执行完成之后开始执行,有两种方式可实现 Thread类的join方法:使宿主线程阻塞指定时间或者直到寄生线程执行完毕 CountDownLatc ...

  2. Python基础 — OS

    OS模块 -- 简介   OS模块是Python标准库中的一个用于访问操作系统功能的模块,OS模块提供了一种可移植的方法使用操作系统的功能.使用OS模块中提供的接口,可以实现跨平台访问.但是在OS模块 ...

  3. tyvj 2054 [Nescafé29]四叶草魔杖【克鲁斯卡尔+状压dp】

    传送:http://www.joyoi.cn/problem/tyvj-2054 来自lyd课件: 所以先预处理出各个sum为0的块,然后状压dfs取min来得到答案 #include<iost ...

  4. 洛谷 P1414 又是毕业季II(未完成)

    题目背景 “叮铃铃铃”,随着高考最后一科结考铃声的敲响,三年青春时光顿时凝固于此刻.毕业的欣喜怎敌那离别的不舍,憧憬着未来仍毋忘逝去的歌.1000多个日夜的欢笑和泪水,全凝聚在毕业晚会上,相信,这一定 ...

  5. 前端javascript 错误 Uncaught SyntaxError: Unexpected token ILLEGAL

    前端控制台报Uncaught SyntaxError: Unexpected token ILLEGAL 错误时,就是非法字符错误,首先检查符号是否正确,不要出现中文标点! 然后检查参数之类的类型是否 ...

  6. C#命名空间 using的用法

    using的用法: 1. using指令:引入命名空间 这是最常见的用法,例如: using System; using Namespace1.SubNameSpace; 2. using stati ...

  7. 视图解析器InternalResourceViewResolver在什么情况下需要配置?在什么情况下不需要配置?

    如果路径名是逻辑名的话,必须配置 -------------- 相对路径,即逻辑名称如果路径名是真实名的话,可选配置 若是绝对路径,则不用配置,即真实名称 注:试一下逻辑名和真实名的例子*****有用 ...

  8. .Net MVC 前台验证跟后台验证

    前台验证: 首先你得有一个参数类,参数类代码如下 验证标记总结 [DisplayName("邮箱:")]        [Required(ErrorMessage = " ...

  9. Sql2008调试问题

    t-sql调试的时候,报以下错误 处理 1.要在服务器本机,不要远程 2.服务器名称用电脑名称(cmd->hostname),不要用IP,(local)或. 调试快捷键跟VS一样 F11逐语句 ...

  10. [ USACO 2007 FEB ] Lilypad Pond (Gold)

    \(\\\) \(Description\) 一张\(N\times M\)的网格,已知起点和终点,其中有一些地方是落脚点,有一些地方是空地,还有一些地方是坏点. 现在要从起点到终点,每次移动走日字\ ...