精华内容
下载资源
问答
  • Linux IO函数

    千次阅读 2016-11-03 10:07:35
    这里介绍的函数都是linux系统中的特有函数,与C标准库中的IO函数存在一定的区别。1、read() 和 write()函数 read() 和 write() 函数是Linux中最基本的读写函数,可以用于各种数据的读写。/* 返回值:成功则为读取...

    Linux网络编程中,针对套接字读写的函数有很多,下面介绍一些函数的常见用法;这里介绍的函数都是linux系统中的特有函数,与C标准库中的IO函数存在一定的区别。

    1、read() 和 write()函数
      
    read() 和 write() 函数是Linux中最基本的读写函数,可以用于各种数据的读写。

    /* 返回值:成功则为读取或写入的字节个数,失败为-1; 
     * 定义:
     */
    #include <unistd.h>
    ssize_t read(int fd, void *buf, size_t nbyte); 
    ssize_t write(int fd, const void* buf, size_t nbytes);
    /* 说明
     * fd 为描述符,可以是文件描述符,也可以是套接字描述符;
     * buf 用于存储读取或写入的数据;
     * nbyte 记录字节数;
     * 根据不同的应用情况,返回值可能小于请求的字节数
     */

    一般来说,对于常规文件的读写不会阻塞,函数一定会在有限的时间内返回,但是从终端设备或网络读取时就不一定了,如果网络通信消息一直没有到达,那么读取函数就一直阻塞等待,终端还没有进行输入时,也是处于阻塞状态。返回的字节数包含换行符。
    阻塞和非阻塞read/write

    2、recv() 和 send() 函数

    这两个函数类似于read() 和 write() 函数,但是这两个函数只用于套接字相关的数据处理。

    /* 返回值:成功则为读取或写入的字节个数,失败为-1;
     * 定义:
     */ 
    #include <sys/socket.h>
    ssize_t recv(int fd, void *buf, size_t n, int flags);
    ssize_t send(int fd, const void *buf, size_t n, int flags);
    /* 前面3个参数与read/write中参数一样,flags的值可为0或下面的值:
     * 1、MSG_DONTROUTE:绕过路由表查找,从直接连接的本机网络上处理数据;
     * 2、MSG_DONTWAIT:仅对本操作执行非阻塞;
     * 3、MSG_OOB:即将发送或接受带外数据;
     * 4、MSG_PEEK:查看已可读取的数据,且系统在recv或recvfrom返回后不丢弃这些数据;
     * 5、MSG_WAITALL:尚未读取请求数目的字节之前读取操作不要返回;
     */
    

    3、readv() 和 writev() 函数

    read() 和 write() 函数在处理数据时数据是连块的,即处理的数据是保存在一个连续的地址空间中的,但是有时候需要一次处理多个在不同地址空间的数据,readv函数可以将数据的输入分散到多个缓冲区中,称为分散读;writev函数可以将多个缓冲区的输出数据写入一个连续的缓冲区内,称为集中写;

    /* 返回值:成功则为读入或写出的字节数,出错则为-1;
     * 定义:
     */
    #include <sys/uio.h>
    ssize_t readv(int fd, const struct iovec *iov, int iovcnt);
    ssize_t writev(int fd, const struct iovec *iov, int iovcnt);
    struct iovec{
        void *iov_base;
        size_t iov_len;
    }
    /* 说明:
     * 参数fd为文件或套接字描述符,iovcnt为结构指针iov中元素个数,最大一般不超过1024;
     * 结构iovec表示一个数据元素,iov_base为数据起始地址,iov_len为数据区大小;
     * 数组指针iov中有几个元素就有几块分散的缓冲区地址块;
     * 两个函数可以用于任何描述符。不仅限于套接字;
     */

    参考:readv()和writev()函数

    4、recvmsg() 和 sendmsg() 函数

    这两个函数只用于套件字的数据处理,是最通用的两个函数,包含前面的几个函数具有的各项功能。

    /* 返回值:成功则为读入或写出的字节数,出错则为-1;
     * 定义:
     */
    #include <sys/socket.h>
    ssize_t  recvmsg(int sockfd, struct msghdr *msg, int flags);
    ssize_t  sendmsg(int sockfd, struct msghdr *msg, int flags);
    
    struct msghdr{
        void        *msg_name;        /*protocol address*/
        socklen_t   msg_namelen;      /*size of protocol address*/
        struct iovec  *msg_iov;       /*scatter/gather array*/
        int         msg_iovlen;       /*#elements in msg_iov*/
        void        *msg_control;     /*ancillary data (cmsghdr struct)*/
        socklen_t   msg_controllen;   /*length of ancillary data */
        int         msg_flags;        /*flags returned by recvmsg()*/
    }
    /* 说明:
     * sockfd为套接字描述符,msg为结构参数指针,flags为标志;
     * msghdr中msg_name,msg_namelen为未连接的套接字地址及其长度;
     * 对于已连接的套接字msg_name直接设为NULL;
     * msgiov,msg_iovlen与readv函数第2,3个参数类似;
     * msg_control,msg_controllen为辅助数据,与结构cmsghdr相关;
     * msg_flags为标志,只有函数recvmsg使用;
     * flags用于输入一定的控制信息,而msg_falgs一般用于返回标志信息;
     * 函数send,recv;sendto,recvfrom,sengmsg,recvmsg都存在flags标志,部分标志在
     * recv函数介绍时已列出,其它参考UNIX网络编程卷1;
     */
    

    5组IO函数比较,yes表示符合说明,空格表示不符合。

    函数 任何描述符 仅套接字描述符 单个读写缓冲区 分散/集中读写 可选标志 可选对端地址 可选控制信息
    read,write yes yes
    readv,writev yes yes
    send,recv yes yes yes
    sendto,recvfrom yes yes yes yes
    sendmsg,recvmsg yes yes yes yes yes

    上面介绍的几组IO函数都是围绕描述符工作的,通常是作为UNIX内核中的系统调用实现;执行IO的另一种方式是使用标准IO函数库,由ANSI C标准规范,便于移植到支持C的非Unix系统上。

      标准IO函数也可以用于套接字上:通过调用fdopen从任何描述符创建一个标准IO流;相反可以通过fileno获取任何一个给定标准IO流的描述符。
      标准IO函数执行以下3类缓冲:
      1、完全缓冲,只在下列情况下才发生IO(数据输出):缓冲区满,进程显式调用fflush,进程调用exit终止自身;标准缓冲区大小一般为8192字节。
      2、行缓冲,只在下列情况下才发生IO:碰到一个换行符,进程调用fflush,进程调用exit终止自身。
      3、不缓冲,每次调用标准IO输出函数都发生IO。
      标准IO函数大多数Unix实现遵循以下规则:
      - 标准错误输出总是不缓冲;
      - 标准输入标准输出完全缓冲,除非他们指代终端设备(这种情况下行缓冲);
      - 所有其他IO流都是完全缓冲,除非他们指代终端设备(这种情况下行缓冲);

    因为套接字并不是终端设备,因此在用标准IO处理套接字数据IO时,需要考虑缓冲问题,然而这样可能会引起一些潜在问题,所以一般情况下尽量避免在套接字上使用标准IO函数库。

    展开全文
  • Linux文件IO函数与标准IO库函数

    千次阅读 2017-06-12 16:48:35
    Linux对文件的操作有两种方式文件IO函数(系统调用)和标准IO库函数调用。系统调用是最直接的方式,库函数调用最终也是通过系统调用实现的。可认为库函数调用是对系统调出于效率考虑而做出的优化。 二者区别: ...

    Linux中,文件有为操作系统和设备提供了一个简单而统一的接口。在Linux中,几乎一切都可以看做文件 。
    Linux对文件的操作有两种方式文件IO函数(系统调用)和标准IO库函数调用。系统调用是最直接的方式,库函数调用最终也是通过系统调用实现的。可认为库函数调用是对系统调出于效率考虑而做出的优化。
    二者区别:
    系统调用是操作系统相关的,因此一般没有跨操作系统的可移植性。
    库函数调用是系统无关的,因此可移植性好。标准的IO库函数对文件的操作最终是通过系统调用实现的,但标准io函数库采用缓存技术,减少系统调用的次数。
    系统调用通常用于底层文件访问(low-level file access),例如在驱动程序中对设备文件的直接访问。
    库函数调用通常用于应用程序中对一般文件的访问。
    一、文件IO函数–系统调用
    基本函数:

    #include<unistd.h>
    int open(const char *path, int flags);
    -->打开或创建一个文件
    int open(const char *path, int flags, mode_t mode );
    -->当用于创建文件时需要用第二个函数指明文件的相关权限信息
    size_t write(int fd, const void *buf, size_t nbytes);
    -->
    size_t read(int fd, void *buf, size_t nbytes);
    int close(int fd);
    off_t lseek(int filedes, off_t offset, int whence);
    -->设置读写文件的当前位置
    whence有三个参数SEEK_SET/SEEK_CUR/SEEK_END(文件开始/当前/结束位置),则文件的偏移量为设置的whence参数加上offset

    二、标准IO库函数

        在基于文件描述符中的底层系统调用的I/O操作中,所有的I/O函数都是针对文件描述符的。当打开一个文件时,即返回一个文件描述符,然后该问价描述符就用于后续的I/O操作。
        在标准I/O库中,所有的I/O操作都是围绕流(stream)来进行的。在Linux中,文件和设备都可以看做是数据流。 
        Linux对一个进程预定义了三个流:标准输入流,标准输出流和标准错误输出流,它们自动地为进程打开并可用。这三个标准I/O流通过在头文件<stdio.h>中预定义的文件指针stdin,stdout和stderr加以引用。它们与文件描述符STDIN_FILENO,STDOUT_FILENO和STDERR_FILENO所表示的标准输入,标准输出和标准错误输出相对应。
         标准I/O库提供了函数fopen用于打开一个流。当打开一个流时,该函数会返回一个指向FILE对象的指针,即文件指针(类型为FILE *)。FILE对象通常是一个结构,它包含了I/O库为管理该流所需要的所有信息:用于实际I/O的文件描述符,指向流缓存的指针,缓存长度,当前在缓存中的字节数,出错标志等。但一般应用程序没有必要关心FILE结构体的各成员值,使用流时,只需要将FILE指针作为参数传递给每个标准I/O函数。 

    基本函数:

    #include <stdio.h>
    FILE *fopen(const char *path, const char *mode);
    FILE *fdopen(int fd, const char *mode);-->使一个标准的I/O流与该描述相结合。
    FILE *freopen(const char *path, const char *mode, FILE *stream);
    -->在指定的流上打开一个指定的文件,此函数一般用于将一个指定的文件打开为预定义的流(如标准输出)。
    int flose(FILE *fp);-->关闭流

    读写流:
    (1)每次一个字符的IO

    int getc(FILE *fp);
    int fgetc(FILE *fp);
    int getchar(void);
    /* 上面三个函数的返回值为int,因为EOF常实现为-1,返回int就能与之比较 */
    
    /* 判断出错或者结束 */
    int ferror(FILE *fp);
    int feof(FILE *fp);
    void clearerr(FILE *fp); /* 清除error或者eof标志 */
    
    /* 把字符压送回流 */
    int ungetc(intc FILE *fp);
    
    /* 输出 */
    int putc(int c, FILE *fp);
    int fputc(int c, FILE *fp);
    int putchar(int c);

    (2)每次一行的IO。

    #include <stdio.h>
    /* 输入 */
    char *fgets(char *restrict buf, int n, FILE *restrict fp);
    char *gets(char *buf);
    /* gets由于没有指定缓冲区,所以有可能造成缓冲区溢出,要小心 */
    
    /* 输出 */
    int fputs(char *restrict buf, FILE *restrict fp);
    int puts(const char *buf);

    (3)直接IO

    #include <stdio.h>
    size_t fread(void *restrict ptr, size_t size, size_t nobj,
                FILE *restrict fp);
    size_t fwrite(const void *restrict ptr, size_t size, size_t nobj,
                FILE *restrict fp);
    /* 返回值:读或写的对象数 */

    定位流

    long ftell(FILE *fp);
    /* 成功则返回当前文件位置指示,出错返回-1L */
    
    int fseek(FILE *fp, long offset, int whence);
    /* 成功返回0, 出错返回非0 */
    
    int fgetpos(FILE *restrict fp, fpos_t *restrict pos);
    int fsetpos(FILE *fp, fpos_t *pos);
    /* 成功返回0,出错返回非0 */

    格式化IO

    执行格式化输出的主要是4printf 函数:
        printf  输出到标准输出
        fprintf  输出到指定流
        sprintf  输出到指定数组
        snprintf  输出到指定数组并在数组的尾端自动添加一个null字节
    格式化输入主要是三个 scanf 函数:
        scanf  从标准输入获取
        fscanf  从指定流获取
        sscanf  从指定数组获取
    展开全文
  • Linux C/C++编程之(十三)系统IO函数

    千次阅读 2020-06-30 22:53:25
    文章目录一、概述二、当头棒喝三、函数概述四、IO函数介绍1)open2)close3)read 一、概述 二、当头棒喝 去掉代码中的注释掉的 fflush 再试下: 系统默认会打开三个文件描述符(stdin,stdout,stderr),在...

    一、概述

    在这里插入图片描述

    二、当头棒喝

    在这里插入图片描述
    在这里插入图片描述
    去掉代码中的注释掉的 fflush 再试下:
    在这里插入图片描述
    在这里插入图片描述
    系统默认会打开三个文件描述符(stdin,stdout,stderr),在程序中 close(1) 关掉了标准输出,此时 open 打开返回的是最小可用的文件描述符,也就是 fd = 1,因此 printf 本应该打印到文件中,但是 close(fd) 不会触发 buffer 刷新,因此既不会输出到屏幕也没有输出到 msg.log 中。

    当打开 fflush,则会刷新 buffer,因此就可以看到 msg.log 文件中"hello world"。
    在这里插入图片描述

    三、函数概述

    Linux C库IO函数工作流程:
    在这里插入图片描述
    pcb和文件描述符:

    • 文件描述符
      • int 类型
      • 一个进程最多可打开多少文件
    • pcb
      • 进程控制块
      • 在其中有一个文件描述符表 – 数组[1024]
        在这里插入图片描述
        虚拟地址空间就是程序启动起来之后,从硬盘上会有一块虚拟内存分配出来。

    CPU 为什么要使用虚拟地址空间与物理地址空间映射?解决了什么样的问题?

    1)方便编译器和操作系统安排程序的地址分布
    程序可以使用一系列相邻的虚拟地址来访问物理内存中不相邻的大内存缓冲区。通过虚拟地址空间与物理地址空间映射,解决不连续的缓冲区的问题。

    2)方便进程之间隔离
    不同进程使用的虚拟地址彼此隔离。一个进程中的代码无法更改正在由另一进程使用的物理内存。

    3)方便OS使用你那可怜的内存。
    程序可以使用一系列虚拟地址来访问大于可用物理内存的内存缓冲区。当物理内存的供应量变小时,内存管理器会将物理内存页(通常大小为 4 KB)保存到磁盘文件。数据或代码页会根据需要在物理内存与磁盘之间移动。

    虚拟地址空间的布局如下:
    在这里插入图片描述
    C库函数与系统函数的关系

    • FD:文件描述符
    • FP_POS:文件指针
    • BUFFER:缓冲区
    • write:对0-3G的用户空间进行操作
    • sys_write:对3-4G的内核空间进行操作
      在这里插入图片描述

    四、IO函数介绍

    1)open

    • 作用:打开文件(可能创建文件)

    • 头文件:
      在这里插入图片描述

    • 参数说明:

      • pathname 文件名
      • flags 标志位
        • 必选项:
          • O_RDONLY 只读
          • O_WRONLY 只写
          • O_RDWR 读写
        • 可选项:
          • O_APPEND 追加
          • O_CREAT 创建文件
          • O_EXCL和O_CREATE一起使用,如果文件存在则报错
          • O_NONBLOCK 非阻塞
      • Mode 权限位,最终(mode&~umask)
    • 返回值:

      • 成功:返回最小的可用文件描述符
      • 失败:返回-1,并且设置errno
    • open 函数中的 errno:
      在这里插入图片描述

    1. 使用 open 实现一个 touch 功能
      在这里插入图片描述
      在这里插入图片描述
    2. 一个进程打开的最大文件数(1024)
      在这里插入图片描述
      在这里插入图片描述

    2)close

    • 作用:关闭文件描述符
    • 头文件:
      在这里插入图片描述
    • 参数说明:
      • fd 文件描述符
    • 返回值:
      • 成功:返回 0
      • 失败:返回 -1,并且设置 errno

    3)read

    • 作用:从文件描述符读
    • 头文件:
      在这里插入图片描述
    • 参数说明
      • fd 文件描述符
      • buf 缓冲区
      • count 缓冲区大小
    • 返回值
      • 失败:返回 -1,设置 errno
      • 成功:
        • 返回读到的字节数
        • 0 代表读到文件末尾
        • 非阻塞的情况下 read 返回 -1,但是此时需要判断 error 的值。

    4)write

    • 作用:写到文件描述符
    • 头文件:
      在这里插入图片描述
    • 参数说明:
      • fd 文件描述符
      • buf 缓冲区
      • count 缓冲区大小
    • 返回值
      • 失败:返回-1,设置 errno
      • 成功:
        • 返回写入的字节数
        • 0 代表未写入
    1. 实现一个 cat 功能
      在这里插入图片描述
      在这里插入图片描述
    2. 需求:给一个文件中写入内容,写完之后打开该文件再读取写入的内容?(bug版本)
      在这里插入图片描述
      在这里插入图片描述
    • 结果:内容写入到文件中,但是并未按预期输出到屏幕上。
    • 原因:是由于 write 完成之后,fd 到了文件末尾,因此 read 时到了文件末尾,无法读取文件数据
    • 解决方法:写完之后将文件指针设置到文件开头,使用请看下文要介绍的 lseek 函数。

    5)lseek

    • 作用:重定位读/写文件de偏移量
    • 头文件:
      在这里插入图片描述
    • 参数说明
      • fd 文件描述符
      • offset 偏移量
      • whence:
        • SEEK_SET 文件开始位置
        • SEEK_CUR 文件当前位置
        • SEEK_END 文件结尾
    • 返回值
      • 失败:返回 -1,设置 errno
      • 成功:返回当前位置到文件开头的长度
    • lseek 作用
      • 移动文件读写位置
      • 计算文件大小
      • 拓展文件
    1. 移动文件读写位置(修改上例的 bug(写入文件内容并读取文件内容打印到屏幕))
      在这里插入图片描述
      在这里插入图片描述
    2. 计算文件大小(输出文件字节数)
      在这里插入图片描述
      在这里插入图片描述
    3. 拓展文件
      在这里插入图片描述
      在这里插入图片描述

    6)fcntl

    • 作用:操作文件描述符
    • 头文件:
      在这里插入图片描述
    • 参数说明:
      • fd 文件描述符
      • cmd 命令
    • 返回值
      • 不同的 cmd 返回值不同
    1. 使用 fcntl 函数实现读非阻塞
      在这里插入图片描述
      在这里插入图片描述

    五、利用IO函数实现一个copy函数

    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • C语言IO函数总结

    万次阅读 2018-10-24 15:56:17
    只用于标准输入(stdin)和标准输出(stdout)的函数 1.getchar putchar 2.gets puts gets:从标准输入读字符。直到出现换行符或读到文件结尾为止。不会检测空间是否足够,会造成空间越界。 puts:向标准输出设备...

    一.只用于标准输入(stdin)和标准输出(stdout)的函数

    1.getchar putchar

    2.gets puts

    1. gets:从标准输入读字符。直到出现换行符或读到文件结尾为止。不会检测空间是否足够,会造成空间越界。
    2. puts:向标准输出设备输出一个字符串,会自动添加换行符
    #define _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    int main(int argc, char *argv[])
    {
    	char arr[8] = "";
    	int len = sizeof(arr) / sizeof(arr[0]);
    
    	printf("请输入小于%d个字符的字符串:\n", len);
    	gets(arr);//运行时会出现断错误
    
    	system("pause");
    	return 0;
    }

    3.sanf printf

    1. sanf:遇到空格、回车、tab键都会结束输入。即不提取后面继续输入的字符。

    4.sscanf sprintf

    scanf:解包

    1. 遇到空格、回车、\0、\t、\v、\f。均结束提取(简单地说就是空白字符与\0都会结束sscanf的提取)。
    2. sscanf(buf, "%c3%c", &ch1, &ch2); buf与format字符串中有匹配项可以跳过,比如3。
    3. 跳过数据:%*d %*s
    4. 指定提取宽度:%3s  %*2s
    5. 指定提取范围:[a~zA~Z0~9] [aBc]
    6. 取反%[^a] 

    sprintf:组包

    1. 格式化字符串
    2. 字符串连接
    3. 把数字转成字符串
    #define _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    int main(int argc, char *argv[])
    {
    	//注意:xx个数并没有限制
    	printf("请输入一个格式为123456@xiao_ming.com的邮箱:");
    	char arr[64] = "";
    	scanf("%s", arr);
    	char msg[32] = "";
    	//sscanf(arr, "%*[^@]@%[^.]", msg);
    	//sscanf(arr, "%*[^@]%*[@]%[^.]", msg);
    	//sscanf(arr, "%*[^@]%*[@]%s%[^.]", msg);
    	sscanf(arr, "%*[^@]%*[@]%s.", msg);
    
    	printf("%s\n", msg);
    
    	system("pause");
    	return 0;
    }
    #define _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    int main(int argc, char *argv[])
    {
            //格式化字符串
            char arr[32] = "";
            sprintf(arr, "%s%s", "我是xiao_ming", " 今年17岁");
    
    	//连接字符串
    	char src[32] = "hello";
    	char dst[32] = " world";
    	sprintf(dst, src);
    	printf("%s\n", dst);
    
    	//把数字转成字符串
    	char buf[32] = "";
    	sprintf(buf, "%d", 1000);
    	printf("%s\n", buf);
    
    	system("pause");
    	return 0;
    }

    二.可用于所有流的输入输出函数

    1.fgetc(getc)    fputc(putc)
    2.fgets         fputs
    3.fprintf        fscanf
    4.fread         fwrite

    int main(int argc, char *argv[])
    {
    	FILE *fp = fopen("C:/Users/lenovo/Desktop/PETool 1.0.0.5.exe","r+"); 
    	if (!fp) { printf("fopenError"); return;} 
    	
    	int c = fgetc(fp);
    	printf("%c\n", (char)c);
    	printf("fgetc之后%p\n", fp); //证明此函数不会改变SEEK位置
    	
    	char arr[2] = { 0 };
    	fgets(arr, 2, fp);
    	printf("%s\n", arr);
    	printf("fgets之后%p\n", fp);
    
    	fseek(fp, 16 * 4, SEEK_SET);
    	int num = 0;
    	if ((num = fprintf(fp, "Hell%cWorld", 'c')) < 0) {
    		printf("fseekError");
    	}
    	else {
    		printf("%d\n", num);
    	}
    
    	char a[64] = { 0 };
    	//int a = fread(fp, sizeof(char), 12, "HelloTencen"); //最后一个参数必须是FILE*类型否则会报错
    	fseek(fp, -10, SEEK_CUR);
    	//fread(a, sizeof(char), 12, (FILE*)"HelloTencen");
    	fread(a, sizeof(char), 10, fp);
    	printf("%s\n", a);
    
    	if (fclose(fp)) { printf("fcloseError");return; }
    
    
    
    	system("pause");
    	return 0;
    }

     注意:Win下路径有两种书写方式:\ 和 /

    但是\是转义字符的意思,\本身也需要转义,所以在书写时写为\\。

    三.文件的打开和关闭

    1. FILE *fp = fopen("file_name", "mode"); 成功返回文件指针,失败返回NULL。
    2. int fclose(FILE* stream); 成功返回0,失败返回-1。

    打开模式

    含义

    r或rb

    以只读方式打开一个文本文件(不创建文件,若文件不存在则报错)

    w或wb

    以写方式打开文件(如果文件存在则清空文件,文件不存在则创建一个文件)

    a或ab

    以追加方式打开文件,在末尾添加内容,若文件不存在则创建文件

    r+或rb+

    以可读、可写的方式打开文件(不创建新文件)

    w+或wb+

    以可读、可写的方式打开文件(如果文件存在则清空文件,文件不存在则创建一个文件)

    a+或ab+

    以添加方式打开文件,打开文件并在末尾更改文件,若文件不存在则创建文件

    注意:b表示二进制模式,二进制模式只在window下有效,在linux中是无效的。linux下所有的文本文件都以\n结尾。在window下二进制读取模式时可以获得\r\n。

    四.文件的随机(指定位置)读取

    1. 移动文件流指针:int fseek(FILE* stream, long offset, int whence); 开始:SEEK_SET   当前位置:SEEK_CUR   文件末尾:SEEK_END
    2. 获取流指针的位置:long ftell(FILE* stream);
    3. 将流指针移到文件开头:void rewind(FILE* stream);

     

     

     

    展开全文
  • 文件IO函数和标准IO库的区别

    千次阅读 2015-09-28 15:51:51
    1,文件IO函数,在Unix中,有如下5个:open,read,write,lseek,close。称之为不带缓存的IO(unbuffered I/O)。不带缓存指的是每个read,write都调用内核中的一个系统调用。 2,标准IO库,由ANSI C标准说明。...
  • Linux 应用开发 - 必须掌握的 5 个底层 IO 函数
  • lua io函数

    千次阅读 2016-01-26 14:58:53
    ioio库提供两种io操作风格。第一种使用隐含的文件描述符,有操作设置默认的 输入文件和输出文件。第二种是明确的文件描述符。当使用明确风格时,所有的 ...I/O函数在出错时返回nil(加一个错误消息和一
  • IO函数实现一个拷贝文件的命令

    千次阅读 2018-06-01 13:25:22
    前言:本篇博客是利用main函数的参数实现一个拷贝文件的命令,要求熟悉使用各个IO函数。【参考代码】:#include&lt;stdio.h&gt; #include&lt;stdlib.h&gt; #pragma warning(disable:4996) int main...
  • 文件IO函数详解(1)-open函数

    千次阅读 2018-05-27 19:11:14
    函数作用:在进程中打开文件和创建文件,如果成功则返回一个文件描述符。 函数原型: 引用头文件:#include&lt;fcntl.h&gt; int open(const char* pathname, int oflag,...); int open(const char* ...
  • C标准库函数是C标准的一部分,而Unbuffered I/O函数是UNIX标准的一部分,在所有支持C语言的 平台上应该都可以用C标准库函数(除了有些平台的C编译器没有完全符合C标准之外),而只有 在UNIX平台上才能使用Unbuffered I/O...
  • C语言中一些常用IO函数的总结

    千次阅读 2017-03-08 14:14:55
    scanf()函数格式化读入函数,采用转换说明匹配 scanf()通过%的形式对数据进行读入,可以一次读入多个数据。scanf的实现依靠指针所以有如下两条规则: 1、scanf()读入基本数据类型时,需要在变量名前加&。 2、...
  • 标准IO函数以及基本知识点总结

    千次阅读 2014-08-10 11:20:26
    标准IO知识,零基础入门,入了门的还可以回顾下哦,本文语言简洁深刻不乏幽默风趣,适合各大牛菜鸟,嘿嘿,,,
  • C标准库IO函数的错误识别

    千次阅读 2011-10-26 16:07:25
    很多系统函数在错误返回时将错误原因记录在libc定义的全局变量errno中,每种错误原因对应一个错误码,请查阅errno(3)的Man Page了解各种错误码,errno在头文件errno.h中声明,是一个整型变量,所有错误码都是正整数...
  • 分享一个特简单的求文本文件行数的程序这里主要利用了标准IO相关的两个函数FILE *fopen(const char *path,const char *mode);char *fgets(char *s,int size,FILE * stream);fopen()函数主要用于打开一个文件(前提...
  • 文件IO函数, 通常包括 open,read,write,lseek,close这五个函数。 还有creat函数,但是现在用open已经可以完全替代creat。 creat = open + oflag(O_WRONLY|O_CREAT|O_TRUNC) int open(const char *...
  • png_set_write_fn(png_ptr, &state, &dcode_png_writer, NULL);
  • C语言常用IO函数

    千次阅读 2018-07-13 14:46:03
    stdin 标准输入流 stdout 标准输出流 stderr 标准错误流 字符IO函数 1. int getchar() 说明:从stdin读取1个字符 返回值:成功,返回该字符;出错,返回EOF; 2. int fgetc(FILE fp) 说明:功能同getchar,...
  • 文件IO相关函数列表

    千次阅读 2014-11-18 14:44:58
    Linux/Unix 文件IO函数列表 open : 打开或创建文件,可检查文件是否存在 create : 创建文件,可检查文件是否存在 close : 关闭文件 read : 从文件描述符读取数据 write : 向文件描述符写入数据 lseek : 修改文件偏移...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 681,514
精华内容 272,605
关键字:

io函数