zoukankan      html  css  js  c++  java
  • 标准I/O库之每次一行I/O

    下面两个函数提供每次输入一行的功能。

    #include <stdio.h>
    char *fgets( char *restrict buf, int n, FILE *restrict fp );
    char *gets( char *buf );
    两个函数返回值:若成功则返回buf,若已到达文件结尾或出错则返回NULL

    这两个函数都指定了缓冲区的地址,读入的行将送入其中。gets从标准输入读,而fgets则从指定的流读。

    对于fgets,必须指定缓冲区的长度n。此函数一直读到下一个换行符为止,但是不超过n-1个字符,读入的字符(包括换行符)被送入缓冲区。该缓冲区以null字符结尾。如若该行(包括最后一个换行符)的字符数超过n-1,则fgets只返回一个不完整的行,但是,缓冲区总是以null字符结尾对fgets的下一次调用会继续读该行。

    gets是一个不推荐使用的函数。其问题是调用者在使用gets时不能指定缓冲区的长度。这样就可能造成缓冲区溢出(如若该行长于缓冲区长度),写到缓冲区之后的存储空间中,从而产生不可预料的结果。gets与fgets的另一个区别是,gets并不将换行符存入缓冲区中

    这两个函数处理换行符方面的差别与UNIX系统的演进有关。早在V7的手册(1979年)中就说明:“为了向后兼容,gets删除换行符,而fgets则保持换行符。”

    即使ISO C要求实现提供gets,但请使用fgets,而不要使用gets。

    fputs和puts提供每次输出一行的功能。

    #include <stdio.h>
    int fputs( const char *restrict str, FILE *restrict fp );
    int puts( const char *str );
    两个函数返回值:若成功则返回非负值,若出错则返回EOF

    函数fputs将一个以null符终止的字符串写到指定的流,尾端的终止符null不写出。注意,这并不一定是每次输出一行,因为它并不要求在null符之前一定是换行符。通常,在null符之前是一个换行符,但并不要求总是如此。

    puts将一个以null符终止的字符串写到标准输出,终止字符不写出。但是,puts然后又将一个换行符写到标准输出

    puts并不像它所对应的gets那样不安全。但是我们还是应避免使用它,以免需要记住它在最后是否添加了一个换行符。如果总是使用fgets和fputs,那么就会熟知在每行终止处我们必须自己处理换行符。

    本篇博文内容摘自《UNIX环境高级编程》(第二版),仅作个人学习记录所用。关于本书可参考:http://www.apuebook.com/

  • 相关阅读:
    ASP.NET Core 介绍和项目解读
    C#性能优化总结
    C# 线程知识--使用Task执行异步操作
    异步编程 In .NET(转载)
    .NET实现WebSocket服务端即时通信实例
    .net core 学习笔记一 Program与Startup
    .net core 自定义中间件
    c# 通过json.net中的JsonConverter进行自定义序列化与反序列化
    c# 通过HttpListener创建HTTP服务
    c# 反射实现模型深拷贝
  • 原文地址:https://www.cnblogs.com/nufangrensheng/p/3505747.html
Copyright © 2011-2022 走看看