C语言基础-fgets/fputs/gets函数使用示例

fgets函数

  • 头文件:stdio.h

  • 函数定义:char * fgets(char * string, int size, FILE * stream);

    • string:字符数组/地址,保存读取到的字符
    • size:要读取字符的个数,实际读入size - 1,在末尾填’\0’
    • stream:文件流指针
  • 函数说明:从文件流中读取一行或指定个数的字符

    • 一行:当读到一个换行字符或者文件结尾(EOF标志)时,fgets()就会结束,并且这个函数会自动给末尾加’\0’

    • 指定个数:size - 1

  • 返回值

    • 成功返回:读取到的字符串,即string

    • 失败或读到文件结尾返回NULL,不能直接通过fgets()的返回值来判断函数是否因出错而终止,应借助feof()函数或ferror()函数来判断

  • 补充:通常用while()循环来使fges()读入文本全部内容,并按行读入

  • gets()函数:char *gets(char *string);

    • 功能:从流中读取一行字符,接收空格、跳格等字符,直至遇到换行符或者到达文件尾为止,并加上\0(i.e. NULL)作为字符串结束符

    • 成功返回:string的指针

    • 失败返回:NULL

    • 与fgets()的区别:读取方式与fgets()相同,同样也在末尾加上NULL,但gets()不能指定读入字符个数,即不检查字符串string的大小,这样容易造成缓存溢出的安全性问题,导致程序奔溃,所以建议使用fgets()函数来代替

  • fputs()函数:int fputs(const char *str, FILE *stream)

    • 功能:将字符串写入指定的流,不包括末尾结束符。空格、跳格、换行符等都正常输出。

    • 返回值:成功返回一个非负值,失败返回EOF


使用实例

  • 从stdin流读入
//例1:读入指定个数的字符并输出

#include <stdio.h>

int main()
{
    char str[80];
    fputs(fgets(str, 80, stdin), stdout);   //读到换行符,文件结束或者读够80字符为止
    return 0;
}


//例2:循环(按行)读入字符并输出
#include <stdio.h>
#include <string.h>
#define N 15

int main()
{
    char a[N] = {0};
    int i = 0;
    while(fgets(a, N, stdin))     //读取失败或读到文件结尾会返回NULL,作为循环条件
    {
        fprintf(stdout, "%d %s\n", i, a);
        i++;
    }
    return 0;
}
  • 按行读入

    • 参数文件

      test.txt内容如下,存放目录E:/temp/test.txt

      00 46 0e 20 43 00 00 00
      00 00 56 00 1c 98 10 e1
      a4 33 ff ff ff ff ff ff
      54 0d 80 82 00 b1 0f 42
      71 bb 66 1e a4 00 00 81
      00 00 00 01 00 ce 80 29
      04 d3 01 80 80 67 42 01
      9d 40 9d 06 bd 80 ff ff
      ff ff ff 82 e7 0d 7a 13
      2d

    • 读取输出

#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <stdlib.h>

int main()
{
    FILE * fp = fopen("E:/temp/test.txt","r");
    assert(fp);
    char buffer[24];
    memset(buffer, 0, 24);
    int i = 1;
    while (!feof(fp))
    {
        if (fputs(fgets(buffer, 24, fp), stdout) == EOF)
            exit(1);
        i++;
    }
    fclose(fp);
    return 0;
}

注:如果在fputs(fgets())之前加上printf(),则printf()输出的内容也会被fputs再次输出。



Acknowledgements:
http://c.biancheng.net/cpp/html/2513.html
http://blog.csdn.net/daiyutage/article/details/8540932

2017.06.22

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值