`
jxsrhsb
  • 浏览: 16398 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

第三章 文件I/O 一

阅读更多
一,名词说明

文件描述符
    针对内核,所有打开文件都是文件描述符引用.文件描述符是一个非负数整数.当打开一个现存文件或创建一个新的文件时,内核向进程返回一个文件描述符.
    按照惯例,UNIX shell使用描述符0与进程的标准输入相结合,文件描述符1与标准输出相结合,文件描述符2与标准出错输出相结合.这些是UNIX shell以及很多应用程序的惯例,与内核无关.不遵照这种惯例,很多UNIX应用程序就不能工作.

magic number(幻数)
    幻数检查用来检查文件中是否有特殊的固定格式的数据.规范的例子如二进制可执行文件(编译后的程序)a.out,该文件格式在标准include目录下的a.out.h文件中定义,也可能在exec.h中定义.这些文件在文件开始部分附近的一个特殊位置保存有一个'幻数',通过幻数告诉UNIX操作系统此文件是二进制可执行文件,和其中包含的其它类型.幻数的概念已经扩展到数据文件.任何在文件固定位置有与文件类型相关的不变标识符的文件都可以这样表示.这些文件中的信息可以从幻数文件/usr/share/magic中读取.

二,常数说明

O_RDONLY只读打开
O_WRONLY只写打开
O_RDWR读,写打开
O_APPEND每次写时都加到文件尾端
O_CREAT若文件不存在则创建它
O_EXCL测试文件存不存在.与O_CREAT同时使用时,文件存在会报错
O_TRUNC如果文件存在,而且为只读或只写成功打开,则将其程度截短为0
O_NOCITY如果pathname指的是终端设备,则不将此设备分配作为此进程的控制终端
O_SYNC使每次write都等到物理I/O操作完成

注意:很多实现将O_RDONLY定义为0,O_WRONLY定义为1,O_RDWR定义为2.

三,函数

open函数:打开或创建一个文件
int open(const char* pathname, int oflag, ... /*, mode_t mode */) 返回:成功 文件描述符,出错 -1

creat函数:创建一个新的文件
int creat(const char* pathname, mode_t [/i])返回:成功为只写描述符,出错为-1
注意:open(pathname, O_WRONLY|O_CREAT|O_TRUNC, [i]mode
);creat函数只以只写方式打开所创建的文件

close函数:关闭一个打开文件
int close(int filedes)返回:成功 0,出错 -1
关闭一个文件时也释放该进程加在该文件上的所有记录锁.当一个进程终止时,它所有的打开文件都由内核自动关闭.很多程序都使用这一功能而不显示地用close关闭打开的文件.

lseek函数
off_t lseek(int filedes, off_t offset, int whence)返回:成功 新的文件位移,出错 -1
whence
SEEK_SET将该文件的位移量设置为距文件开始处offset个字节
SEEK_CUR将该文件的位移量设置为其当前值加offset,offset可为+/-
SEEK_END将文件的位移量设置为文件长度加offset,offset可为+/-

每个打开文件都有一个与其相关联的"当前文件位移量".它是一个非负整数,用一度量从文件开始处计算的字节数.通常,读写操作都从当前文件位移量处开始,并事位移量增加所读或写的字节数.
off_t currpos;
currpos = lseek(fd, 0, SEEK_CUR);

以上方式可以确定一个打开文件的当前位移量,也可以用这种方法来确定所涉及的文件是否可以设置位移量.如果文件描述符引用的是一个管道或FIFO,则lseek返回-1,并将errno设置为EPIPE.
eg.
#include <sys/types.h>
#include "ourhdr.h"

int mian(void)
{
    if(lseek(STDIN_FIFENO, 0, SEEK_CUR) == -1) //必须用==-1,而不能用是否小于0,因为某些设备允许负值
        printf("cannot seek\n");
    else
        printf("seek OK\n");
    exit(0);
}

lseek仅将当前位移量记录在内核内,并不引起任何I/O操作.然后位移量用于下一个读或写操作.
当文件位移量大于当前文件的长度时,该文件的下一次写将延长该文件,并在文件种构成一个空调,该文件没有写过的字节都被读为0.
eg.
#include <sys/types.h>
#include <sys/stat.h>
#include "ourhdr.h"

char buf1[] = "abcdefghijklmnopqrstuvwxyz";
char buf2[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

int main(void)
{
    int fd;

    if((fd = creat("file.hole", FILE_MODE)) < 0)
        err_sys("creat error");

    if (write(fd, buf1, 10) != 10)
        err_sys("buf1 write error");

    if(lseek(fd, 40, SEEK_SET) == -1)
        err_sys("lseek error");

    if(write(fd, buf2, 10) != 10)
        err_sys("buf2 write error");

    exit(0);
}


read函数:从打开文件中读数据
ssize_t rea(int filedes, void buff, size_t nbytes)返回:读到的字节数,文件结尾 0,出错 -1
际读到的字节数少于要求读字节数的情况:
  • 读普通文件时,在读到要求字节数之前已到达了文件尾端。例如,若在到达文件尾端之前还有30个字节,而要求读 100个字节,则read返回30,下一次再调用read时,它将返回0(文件尾端)。
  • 当从终端设备读时,通常一次最多读一行。
  • 当从网络读时,网络中的缓冲机构可能造成返回值小于所要求读的字节数。
  • 某些面向记录的设备,例如磁带,一次最多返回一个记录。

write函数:向打开文件写数据
ssize_t write(int filedes, const void buff, size_t nbytes返回:成功 以写的字节数 出错 -1
其返回值通常与参数nbytes的值相同,否则表示出错.write出错的常见原因:磁盘已写满,或者超过了对一个给定进程的文件长度限制.
分享到:
评论

相关推荐

    用C++实现简单的文件I/O操作

    ### C++中的简单文件I/O操作详解 #### 一、ASCII输出 在C++中,进行文件的输入输出(I/O)操作是非常常见的需求。本文将详细介绍如何使用C++来进行基本的ASCII文件I/O操作。 要进行文件I/O操作,首先需要包含相应...

    文件I/O常用函数总结

    - `mode`: 第三个参数仅当创建新文件时(即使用了`O_CREAT`时)才使用,用于指定文件的访问权限位(用八进制数表示权限)。默认情况下,如果未指定此参数,通常会使用默认权限`0666`,然后根据当前掩码进一步调整。 ...

    Java I/O, 2nd Edition

    1. **Java I/O基础**:书中首先介绍了Java I/O的基本概念,如流、缓冲区、字符编码和文件操作。流是数据传输的核心机制,分为字节流和字符流两大类,包括输入流和输出流。缓冲区则可以提高I/O操作的效率,减少磁盘和...

    Linux的I/O编程的基础实验open.c

    如果提供了第三个参数`mode`,那么在创建新文件时会设定文件的权限。 常见的`flags`选项有: - `O_RDONLY`:只读模式。 - `O_WRONLY`:只写模式。 - `O_RDWR`:读写模式。 - `O_CREAT`:如果文件不存在,则创建文件...

    Windows2000 磁盘I/O API 函数应用举例

    在Windows操作系统中,磁盘I/O操作是十分重要的一个方面,尤其是在早期的Windows2000系统中,开发人员需要掌握一系列API函数来管理和操作磁盘设备。本文通过一个具体的示例程序,介绍了如何使用Windows2000提供的...

    西门子之与驱动相关的I / O组态.pdf

    西门子自动化技术是工业控制领域中的重要组成部分,其中I/O(输入/输出)组态作为其关键配置之一,是确保设备和系统之间正确数据交换的基础。西门子的SIMOTION系列驱动产品提供了高性能的运动控制解决方案,本文主要...

    C++ I/O Streams ppt

    虽然文件I/O是本章的一个主要主题,但标签中提到的“C++”暗示了这里可能也涉及面向对象编程的概念。继承是面向对象编程的关键特性之一,它允许子类(派生类)继承父类(基类)的属性和行为。在I/O流中,可能会讨论...

    EDA/PLD中的LabVIEW的文件I/O操作

    1. **创建或打开文件**:这是文件I/O的第一步。在LabVIEW中,你可以使用“创建文件”或“打开文件”函数来访问文件。打开文件时,系统会返回一个引用句柄,这个句柄是文件的唯一标识,后续的读写操作都将通过这个...

    Unix网络编程 第6章 I/O服用: select和poll函数 第6章.tar.gz 对本章的代码简易的练习

    在进行"Unix网络编程 第6章 I/O复用:select和poll函数"的代码练习时,你可能会涉及到以下内容: 1. 创建并初始化`fd_set`或`pollfd`结构。 2. 使用`FD_SET()`或`pollfd`结构添加文件描述符。 3. 设置合适的超时时间...

    Linux文件I/O编程实验代码copy_file

    在Linux系统中,文件I/O(输入/输出)编程是应用程序与存储设备交互的基础,它涉及到读取、写入和处理文件。在这个实验"Linux文件I/O编程实验代码copy_file"中,我们将深入理解如何使用C语言进行低级别的文件复制。...

    计算机编程:C语言文件I/O操作基础与实践指南

    #### 一、文件I/O概述 在C语言中,文件输入/输出(I/O)操作是程序设计中的重要组成部分,它允许程序与外部文件进行交互。通过文件I/O操作,程序能够读取文件中的数据或将数据写入文件,这对于数据持久化存储、数据...

    unix环境高级编程

    第3章 文件I/O 第四章〓文件和目录 第五章〓标准I/O库 第六章〓系统数据文件和信息 第七章〓Unix进程的环境 第八章〓进程控制 第九章〓进程关系 第十章:信号 第11章 终端I/O 第十二章 高级I/O 第十三章 精灵进程 第...

    unix环境高级编程.rar

    第3章 文件I/O 35 第4章 文件和目录 54 第5章 标准I/O库 91 第6章 系统数据文件和信息 110 第7章 UNIX进程的环境 122 第8章 进程控制 141 第9章 进程关系 180 第10章 信号 198 第11章 终端I/O 246 第12章 高级I/O ...

    unix 高级编程(上)

    第 3章 文件I/O 547K 第 4章 文件和目录 1.1M 第 5章 标准I/O库 538K 第 6章 系统数据文件和信息 351K 第 7章 UNIX进程的环境 597K 第 8章 进程控制 1.2M 第 9章 进程关系 562K 第10章 信号 1.6M 第11章 ...

    MATLAB 2014从新手到高手视频教程下载第18章 文件I、O.zip

    - 文件I/O函数,如`fopen`用于打开文件,`fclose`用于关闭文件,`feof`检测文件是否到达末尾。 2. **文本文件读写** - `fgets`和`fprintf`用于逐行读取和写入文本文件。 - `fscanf`和`fprintf`用于格式化输入...

    WAGO_IOCheck3_Setup在线调试工具.zip

    在实际应用中,安装“WAGO_IOCheck3_Setup.exe”文件是使用该工具的第一步。这个可执行文件包含了完整的IOCheck3软件和必要的驱动程序,只需按照安装向导的提示进行操作,即可完成安装过程。 总的来说,WAGO ...

    程序设计训练之 Rust 编程语言 第七讲:I/O 与异步编程

    ### 程序设计训练之 Rust 编程语言 第七讲:I/O 与异步编程 #### 输入输出异步编程的概念 本讲主要聚焦于Rust编程语言中的输入输出(I/O)以及异步编程的基本概念和技术。Rust语言因其高效、安全的特点,在系统...

    用Visual Basic实现对系统I/O端口的操作.vb

    总的来说,Visual Basic通过第三方库如WinIO和PortTalk,为开发者提供了一种途径去实现对系统I/O端口的直接操作,从而扩展了VB的应用范围,使其能够处理更复杂的硬件交互任务。在学习和使用这些库时,不仅需要掌握VB...

Global site tag (gtag.js) - Google Analytics