热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

写文件与错误处理

写文件与错误处理一、背景上一篇总结探究了who的实现过程。学会了使用联机帮助来为自己披荆斩棘、解决问题。who命令从utmp结构中读出数据并且通过标准输出方式输出。而并未往文件中写数据。这一篇总结将会

写文件与错误处理

一、背景

上一篇总结探究了who的实现过程。学会了使用联机帮助来为自己披荆斩棘、解决问题。who命令从utmp结构中读出数据并且通过标准输出方式输出。而并未往文件中写数据。这一篇总结将会讨论之。另外将讨论linux系统调用的错误处理方式。

二、写文件

1.查找写文件的系统调用

写文件的系统调用当然可以直接从书中查找到是write。但运用联机帮助的知识也很容易的查找到。首先要联想到写文件相关联的一定是读文件系统调用readread现在已经熟悉了。那么在SEE ALSO中就可以看到写文件为write

接下来当然是用帮助文档查看下write的使用方法。

头文件与使用方法皆在其中。

2.编写cp命令

cp命令是复制粘贴命令,它会在你指定的位置创建一个新的文件并将你指定的旧文件的内容写入到新文件中。明白原理后就应该知道这里需要这几个系统调用:打开旧文件、创建新文件、读旧文件到缓冲区、写缓冲区的数据至新文件、将两个文件都关闭。这里除了创建新文件现在还不知道使用哪个系统调用外,其它的系统调用都已经使用过了。

不过这里用联机帮助我也没在SEE ALSO中找得到新建文件的系统调用。在书上查找到使用creat并使用联机帮助查询其头文件与使用方法。

在这里我发现它的使用方法与open的使用方法极为相似。而且SYNOPSIS(概览)都是一样的。只怪自己大意,其实在open中就应该想到creat是创建新的文件系统调用了。

cp命令的实现代码如下:

#include

#include

#include

#include

 

#define LEN 10000

#define MODE 0644

 

void error(char *,char *);

 

int main(int argc,char *argv[])

{

        int in_fd,out_fd,number;

        char buffer[LEN];

        if(argc!=3)

         { fprintf(stderr,"usage like this: %s source destination.\n",argv[0]);

        exit(1);

        }

        if((in_fd=open(argv[1],O_RDONLY))==-1)

          error("Cannot open the sourcefile.\n",argv[1]);

        if((out_fd=creat(argv[2],MODE))==-1)

          error("Cannot open the destinationfile.\n",argv[2]);

        while((number=read(in_fd,buffer,LEN))>0)

          if(write(out_fd,buffer,number)!=number)

          error("failed to write to the destination.\n",argv[2]);

        if(number==-1)

        error("failed to read from the sourcefile.\n",argv[1]);

        if((close(in_fd)==-1) || (close(out_fd))==-1)

        error("failed to close the file","");

        return 0;

}

 

void error(char *a,char *b)

{

        fprintf(stderr,"error:%s",a);

        perror(b);

exit(1);

}

 

这个程序的实现其实相对于who会简单一点。主要是需要处理好错误处理。错误处理后面会分析到。

 

二、处理系统调用中的错误

1.错误的出现

系统调用中可能会出现许多种类型的错误,比如open:当打开一个文件你却没权限时会报错,如果已经打开很多文件内存不足也会报错,如果你打开的这个文件根本就不存在,当然也会报错。总之错误方式多多。而无论是opencreat还是readwriteclose,报错都是会返回一个值:-1的。

2.确定错误种类

种类繁多的错误,都只是返回-1,可若要进行某种修正,那么编程者知道到底是何种错误就显得尤其重要了。确定错误种类的命令errno,查看其联机帮助可以看到各种错误代码的说明,多得数不胜数。我随便截了一部分。

也就是说,当errno==(某个错误代码)时,就应该是某种错误类型,在标准输出就应该输出其对应的说明了。程序示例如下:

#include

extern int errno;

int sample()

{

        int fd;

        fd=open("file",O_RDONLY);

        if(fd==-1)

        {

        printf("Cannot open file:");

        if(errno==ENOENT)

        printf("There is no such file.\n");

        if(errno==EINTR)

        printf("Interrupted while opening file.\n");

        if(errno==EACCESS)

        printf("You do not have permission to open file.\n");

        ...

这段程序是不完整的程序,就是为了说明每一种错误类型均对应某一种应标准输出的错误说明。

3.perror

这个命令是一种更为方便省心的错误处理方式。之前我的程序代码中就多次出现了。将前面的sample程序修改一下:            

    int sample()

{

        int fd;

        fd=open("file",O_RDONLY);

        if(fd==-1)

        {

        perror("cannot open this file");

        exit(1);

        ...

由此可以看出这种错误输出方式确实简单方便的多。所以非常常用。

这里看一个实例,刚才编写的cp命令来错误的使用:

我用自己编写的cp来复制1233.c,可以看到其报错信息如前所述。

 

三、总结

    写文件沿袭了上一次的总结,只是新学习了两个系统调用:creatwrite。而处理调用中的错误就是学会使用perror命令。errno运作方式了解即可。



推荐阅读
  • ###问题删除目录时遇到错误提示:rm:cannotremoveusrlocaltmp’:Directorynotempty即使用rm-rf,还是会出现 ... [详细]
  • 不确定性|放入_华为机试题 HJ9提取不重复的整数
    不确定性|放入_华为机试题 HJ9提取不重复的整数 ... [详细]
  • 本文介绍了Linux系统中的文件IO操作,包括文件描述符、基本文件操作函数以及目录操作。详细解释了各个函数的参数和返回值,并提供了代码示例。 ... [详细]
  • 本文详细介绍了C语言的起源、发展及其标准化过程,涵盖了从早期的BCPL和B语言到现代C语言的演变,并探讨了其在操作系统和跨平台编程中的重要地位。 ... [详细]
  • 本文详细介绍了Java中实现异步调用的多种方式,包括线程创建、Future接口、CompletableFuture类以及Spring框架的@Async注解。通过代码示例和深入解析,帮助读者理解并掌握这些技术。 ... [详细]
  • 深入了解 Windows 窗体中的 SplitContainer 控件
    SplitContainer 控件是 Windows 窗体中的一种复合控件,由两个可调整大小的面板和一个可移动的拆分条组成。本文将详细介绍其功能、属性以及如何通过编程方式创建复杂的用户界面。 ... [详细]
  • 在多线程编程环境中,线程之间共享全局变量可能导致数据竞争和不一致性。为了解决这一问题,Linux提供了线程局部存储(TLS),使每个线程可以拥有独立的变量副本,确保线程间的数据隔离与安全。 ... [详细]
  • 实体映射最强工具类:MapStruct真香 ... [详细]
  • dotnet 通过 Elmish.WPF 使用 F# 编写 WPF 应用
    本文来安利大家一个有趣而且强大的库,通过F#和C#混合编程编写WPF应用,可以在WPF中使用到F#强大的数据处理能力在GitHub上完全开源Elmis ... [详细]
  • 深入理解Redis的数据结构与对象系统
    本文详细探讨了Redis中的数据结构和对象系统的实现,包括字符串、列表、集合、哈希表和有序集合等五种核心对象类型,以及它们所使用的底层数据结构。通过分析源码和相关文献,帮助读者更好地理解Redis的设计原理。 ... [详细]
  • 本文详细介绍了Java中的输入输出(IO)流,包括其基本概念、分类及应用。IO流是用于在程序和外部资源之间传输数据的一套API。根据数据流动的方向,可以分为输入流(从外部流向程序)和输出流(从程序流向外部)。此外,还涵盖了字节流和字符流的区别及其具体实现。 ... [详细]
  • 本文深入探讨了HTTP请求和响应对象的使用,详细介绍了如何通过响应对象向客户端发送数据、处理中文乱码问题以及常见的HTTP状态码。此外,还涵盖了文件下载、请求重定向、请求转发等高级功能。 ... [详细]
  • C语言基础入门:7个经典小程序助你快速掌握编程技巧
    本文精选了7个经典的C语言小程序,旨在帮助初学者快速掌握编程基础。通过这些程序的实践,你将更深入地理解C语言的核心概念和语法结构。 ... [详细]
  • PHP 过滤器详解
    本文深入探讨了 PHP 中的过滤器机制,包括常见的 $_SERVER 变量、filter_has_var() 函数、filter_id() 函数、filter_input() 函数及其数组形式、filter_list() 函数以及 filter_var() 和其数组形式。同时,详细介绍了各种过滤器的用途和用法。 ... [详细]
  • 本文介绍如何利用栈数据结构在C++中判断字符串中的括号是否匹配。通过顺序栈和链栈两种方式实现,并详细解释了算法的核心思想和具体实现步骤。 ... [详细]
author-avatar
qixian0392_648
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有