标准IO_文件读写_fgetc,getchar,ungetc,fgets,fputs,fread,fwrite

news2024/9/23 13:19:35

目录

1.单字符文件读写

1.1 单字符读文件

1.1.1 fgetc函数

1.1.2 getc函数

1.1.3 getchar函数

1.1.4 ungetc函数

1.1.5 单字符读文件综合示例代码

1.2 单字符写文件

1.2.1 fputc函数

1.2.2 putc函数

1.2.3 putchar函数

1.2.4 单字符写文件综合示例代码

2.多字符文件读写

2.1 多字符读文件

2.1.1 fgets函数

2.1.2 gets函数

2.1.3 多字符读文件综合示例代码

2.2 多字符写文件

2.2.1 fputs函数

2.2.2 puts函数

2.2.3 多字符写文件综合示例代码

3.二进制读写

3.1 二进制读文件

3.1.1 fread函数

3.1.2 fread函数示例代码

3.2 二进制写文件

3.2.1 fwrite函数

3.2.2 fwrite函数示例代码


1.单字符文件读写

1.1 单字符读文件

1.1.1 fgetc函数

#include <stdio.h>

int fgetc(FILE *stream);

函数简介:fgetc函数是C语言中用于从文件中逐个字符读取数据的函数之一。

函数参数:

stream:要读取的文件指针。

函数返回值:

成功:返回读取的字符作为整数。

失败:读取失败或到达文件末尾,则返回EOF(End of File)。

1.1.2 getc函数

#include <stdio.h>

int getc(FILE *stream);

函数简介:getc函数是C语言中用于从文件中逐个字符读取数据的函数之一。

函数参数:

stream:要读取的文件指针。

函数返回值:

成功:返回读取的字符作为整数。

失败:读取失败或到达文件末尾,则返回EOF(End of File)。

1.1.3 getchar函数

#include <stdio.h>

int getchar(void);

函数简介:getchar函数是C语言中的一个标准库函数,用于从标准输入流(stdin)中读取一个字符。

函数参数:

无参数。

函数返回值:

成功:返回读取的字符作为整数。

失败:读取失败或到达文件末尾,则返回EOF(End of File)。

1.1.4 ungetc函数

#include <stdio.h>

int ungetc(int c, FILE *stream);

函数简介:ungetc函数是C语言标准库中的一个函数,用于将一个字符推回到输入流中。

函数参数:

c:要推回的字符。

stream:要推回的文件指针。

函数返回值:

成功:返回成功推回的字符c。

失败:返回EOF(-1)。

ungetc函数原理

 图 1-1 ungetc函数原理

ungetc函数相对于其他单个字符处理函数来说,理解起来稍微困难一点,网上有很多资料讨论ungetc函数,有时候真的会被绕晕。

其实我们认真阅读一下glibc源码,就能发现ungetc函数只是将_IO_read_ptr指针后退了一个字节,然后将需要推回的字符填充至该字节,下次就能再次读到这个字节。

ungetc函数主要的作用就是一个预览的作用。


ungetc函数使用注意事项

  • ungetc函数只能推回一个字符,即使传入的字符c是多字节字符。
  • ungetc函数只能将字符推回到读缓冲区中,不能用于改变文件指针位置。

1.1.5 单字符读文件综合示例代码

int single_char_read_test() {
    int c = 0;
#if 1
    FILE *fp = fopen(TEST_FILE, "r+");
    if (!fp) {
        perror("fopen error");
        return -1;
    }
#else
    FILE *fp = stdin;
#endif
    c = fgetc(fp);
    putchar(c);
    c = getc(fp);
    putchar(c);
    c = getchar();
    putchar(c);

    ungetc('+', fp);
    c = fgetc(fp);
    putchar(c);

    if (fp != stdin) {
        fclose(fp);
    }
    return 0;
}

1.2 单字符写文件

1.2.1 fputc函数

#include <stdio.h>

int fputc(int c, FILE *stream);

函数简介:fputc函数是C语言中用于将一个字符写入到指定文件中的函数。

函数参数:

c:表示要写入的字符,以整数形式传递。

stream:表示要写入的文件指针。

函数返回值:

成功:返回写入成功的字符。

失败:返回EOF(-1)。

1.2.2 putc函数

#include <stdio.h>

int putc(int c, FILE *stream);

函数简介:putc函数是C语言中用于将一个字符写入到指定文件中的函数。

函数参数:

c:表示要写入的字符,以整数形式传递。

stream:表示要写入的文件指针。

函数返回值:

成功:返回写入成功的字符。

失败:返回EOF(-1)。

1.2.3 putchar函数

#include <stdio.h>

int putchar(int c);

函数简介:putchar函数是C语言标准库中的一个函数,用于将一个字符输出到标准输出流(stdout)。

函数参数:

c:表示要写入的字符,以整数形式传递。

函数返回值:

成功:返回写入成功的字符。

失败:返回EOF(-1)。

1.2.4 单字符写文件综合示例代码

int single_char_write_test() {
#if 0
    FILE *fp = fopen(TEST_FILE, "r+");
    if (!fp) {
        perror("fopen error");
        return -1;
    }
#else
    FILE *fp = stdout;
#endif
    fputc('a', fp);
    putc('b', fp);
    putchar('c');

    if (fp != stdout) {
        fclose(fp);
    }
    return 0;
}

2.多字符文件读写

2.1 多字符读文件

2.1.1 fgets函数

#include <stdio.h>

char *fgets(char *s, int size, FILE *stream);

函数简介:fgets函数是C语言中用于从指定的文件中读取一行数据的函数。

函数参数:

s:表示一个字符数组,用于存储读取到的字符串数据。

size:表示要读取的最大字符数。

stream:表示要读取的文件指针。

函数返回值:

成功:返回一个指向s的指针。

失败:读取失败或者已经到达文件末尾,则返回NULL。

注意事项:

  • fgets函数会根据指定的size来限制读取的字符数,遇到换行符('\n')或者文件结束符(EOF)时会停止读取。
  • fgets会将最后一个读到的字符替换为终止符('\0'),特别是在限制了size的情况,通常会比读到的字符数量(size)少一个字符,因为最后一个字符被替换成终止符('\0')。

2.1.2 gets函数

#include <stdio.h>

char *gets(char *s);

函数简介:gets函数是用于从标准输入(stdin)中读取一行字符串的函数,gets函数会从标准输入中读取字符,直到遇到换行符('\n')为止,并将读取到的字符存储在str所指向的字符数组中。它会自动添加字符串终止符('\0')。

由于gets函数无法检查输入字符的长度,容易导致缓冲区溢出(buffer overflow)的问题。这使得gets函数非常不安全,容易受到缓冲区溢出攻击,可能导致程序崩溃或被恶意利用。

函数参数:

s:表示一个字符数组,用于存储读取到的字符串数据。

函数返回值:

成功:返回一个指向s的指针。

失败:读取失败或者已经到达文件末尾,则返回NULL。

2.1.3 多字符读文件综合示例代码

int multil_char_read_test() {
    char rbuf[BUF_SIZE] = {0};
#if 0
    FILE *fp = fopen(TEST_FILE, "r+");
    if (!fp) {
        perror("fopen error");
        return -1;
    }
#else
    FILE *fp = stdin;
#endif
    memset(rbuf, 0, BUF_SIZE);
    char *p = fgets(rbuf, 10, fp);
    printf("p:%s\n", p);
    printf("rbuf:%s\n", rbuf);

    if (fp != stdin) {
        fclose(fp);
    }
    return 0;
}

2.2 多字符写文件

2.2.1 fputs函数

#include <stdio.h>

int fputs(const char *s, FILE *stream);

函数简介:fputs函数是C语言中用于向指定的文件写入字符串的函数。

函数参数:

s:表示要写入的字符串数据。

stream:表示要写入的文件指针。

函数返回值:

成功:返回一个非负整数。

失败:返回EOF(-1)。

2.2.2 puts函数

#include <stdio.h>

int puts(const char *s);

函数简介:puts函数是C语言中用于向标准输出(stdout)打印字符串的函数,puts函数会将字符串打印到标准输出中,并自动在字符串末尾添加换行符('\n')。

函数参数:

s:表示要写入的字符串数据。

函数返回值:

成功:返回一个非负整数。

失败:返回EOF(-1)。

2.2.3 多字符写文件综合示例代码

int multil_char_write_test() {
    char wbuf[BUF_SIZE] = {0};
#if 1
    FILE *fp = fopen(TEST_FILE, "r+");
    if (!fp) {
        perror("fopen error");
        return -1;
    }
#else
    FILE *fp = stdout;
#endif

#define TEST1_STRING "helloworld\n"
    memset(wbuf, 0, BUF_SIZE);
    memcpy(wbuf, TEST1_STRING, sizeof(TEST1_STRING));
    printf("wbuf:%s\n", wbuf);
    int ret = fputs(wbuf, fp);
    printf("fputs ret:%d\n", ret);
    if (ret == EOF) {
        perror("fputs error");
        goto out;
    }
    ret = puts(TEST_STRING);
    printf("puts ret:%d\n", ret);
    if (ret == EOF) {
        perror("puts error");
        goto out;
    }

out:
    if (fp != stdout) {
        fclose(fp);
    }
    return 0;
}

3.二进制读写

3.1 二进制读文件

3.1.1 fread函数

#include <stdio.h>

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

函数简介:fread函数是C语言标准库中的一个函数,用于从文件中读取数据。

函数参数:

ptr:指向一个用于存储读取数据的内存区域的指针。

size:每个数据元素的字节数。

nmemb:要读取的数据元素个数。

stream:指向文件对象的指针。

函数返回值:

成功:实际成功读取的数据元素个数,通常等于参数nmemb。

失败:如果发生错误或到达文件末尾,则返回值可能小于参数nmemb(通常为0)。

3.1.2 fread函数示例代码

int fread_test() {
    int ret = 0;
    char rbuf[BUF_SIZE] = {0};
    FILE *fp = fopen(TEST_FILE, "r+");
    if (!fp) {
        perror("fopen error");
        return -1;
    }

    memset(rbuf, 0, BUF_SIZE);

    int count = 2;
    while((ret = fread(rbuf, 100, count, fp)) == count) {
        printf("ret:%d\n", ret);
    }
    printf("break ret:%d\n", ret);

    fclose(fp);

    return 0;
}

3.2 二进制写文件

3.2.1 fwrite函数

#include <stdio.h>

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

函数简介:fwrite函数是C语言标准库中的一个函数,用于将数据写入文件。

函数参数:

ptr:指向要写入文件的数据的指针。

size:每个数据元素的字节数。

nmemb:要写入的数据元素个数。

stream:指向文件对象的指针。

函数返回值:

成功:实际成功写入的数据元素个数,通常等于参数nmemb。

失败:如果发生错误,则返回值可能小于参数nmemb(通常为0)。

3.2.2 fwrite函数示例代码

int fwrite_test() {
    char sbuf[BUF_SIZE] = {0};
    for (int i = 0; i < BUF_SIZE; i++) {
        sbuf[i] = 'S';
    }

    FILE *fp = fopen(TEST_FILE, "w+");
    if (!fp) {
        perror("fopen error");
        return -1;
    }
    int count = 5;
    int ret = fwrite(sbuf, BUF_SIZE, count, fp);
    printf("fwrite count:%d, ret:%d\n", count, ret);
    if (ret != count) {
        perror("fread error");
        goto out;
    }

out:
    fclose(fp);

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/801519.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c++11 标准模板(STL)(std::basic_filebuf)(七)

定义于头文件 <fstream> template< class CharT, class Traits std::char_traits<CharT> > class basic_filebuf : public std::basic_streambuf<CharT, Traits> std::basic_filebuf 是关联字符序列为文件的 std::basic_streambuf 。输入序…

python核心-面向对象-三大特性:封装,继承,多态

封装 继承 # class Animal: # pass # # class xxx: # pass # # class Dog(Animal,xxx): # pass # # # d Dog() # print(d.__class__) # print(Dog.__class__) # # # print(Dog.__bases__) # print(Animal.__bases__) # # object# ---------------------继承-资源…

最小环计数

Problem - 7322 思路&#xff1a;跑一个floyd&#xff0c;同时求出最小环以及进行最小环计数&#xff0c;对于每个环&#xff0c;我们每次用编号最大的点进行统计&#xff0c;防止重复 以下是模板 for(int k1;k<n;k) {for(int i1;i<n;i) {for(int j1;j<n;j) {if(dis…

java快速生成数据库表文档(HTML、DOC、MD)

在企业级开发中、我们经常会有编写数据库表结构文档的时间付出&#xff0c;关于数据库表结构文档状态&#xff1a;要么没有、要么有、但都是手写、后期运维开发&#xff0c;需要手动进行维护到文档中&#xff0c;很是繁琐&#xff0c;这里推荐一个开源项目&#xff1a;screw gi…

读数据压缩入门笔记09_多媒体数据压缩

1. 压缩分类 1.1. 多媒体数据压缩&#xff08;media-specific compression&#xff09; 1.2. 通用压缩&#xff08;general purpose compression&#xff09; 2. 有损压缩算法 2.1. 为了使数据压缩得更小&#xff0c;可以牺牲多媒体的质量这样的数据转换 2.2. 针对特定的多…

Kaggle灾难推文的自然语言处理-最佳得分详解

目录 灾难推文的自然语言处理——预测哪些推文是关于真实灾难的&#xff0c;哪些不是。 一、比赛概述 二、数据集 三、代码 0.导入库与数据 1. 关键字和位置 1.1 缺失值 1.2 元素和目标分布 2. 元特征 3. 目标和N-grams 3.1 目标 3.2 unigrams 一元语法 3.3 big…

[回馈]ASP.NET Core MVC开发实战之商城系统(三)

经过一段时间的准备&#xff0c;新的一期【ASP.NET Core MVC开发实战之商城系统】已经开始&#xff0c;在之前的文章中&#xff0c;讲解了商城系统的整体功能设计&#xff0c;页面布局设计&#xff0c;环境搭建&#xff0c;系统配置&#xff0c;及首页【商品类型&#xff0c;ba…

如何使用ArcGIS Pro制作越来越真实的水域效果

制图的目的就是为了让图更加的美观&#xff0c;这里我们以水域效果为例&#xff0c;为大家讲解一下如何一步步制作越来越真实的水域效果&#xff0c;希望能对你有所帮助。 常规效果 使用过ArcMap制图的朋友应该比较熟悉&#xff0c;可以在符号系统内修改一下填充颜色&#xff…

启用、禁用员工账号

接口相关信息 controller层 /** 启用禁用员工账号* */PostMapping("/status/{status}")ApiOperation("启用禁用员工账号")public Result startOrStop(PathVariable Integer status, Long id) {log.info("启用禁用员工{}&#xff0c;{}",status,i…

Bert模型及变体

ALBert ALBERT就是为了解决模型参数量大以及训练时间过长的问题。ALBERT最小的参数只有十几M, 效果要比BERT低1-2个点&#xff0c;最大的xxlarge也就200多M。可以看到在模型参数量上减少的还是非常明显的&#xff0c;但是在速度上似乎没有那么明显。最大的问题就是这种方式其实…

Kubernetes 之CNI 网络插件对比

介绍 网络架构是Kubernetes中较为复杂、让很多用户头疼的方面之一。Kubernetes网络模型本身对某些特定的网络功能有一定要求&#xff0c;但在实现方面也具有一定的灵活性。因此&#xff0c;业界已有不少不同的网络方案&#xff0c;来满足特定的环境和要求。 CNI意为容器网络接…

Java是什么?为什么众多编程语言要学习Java?Java有哪些特点?

Java 是近 十几 年来计算机软件发展过程中的传奇&#xff0c;其在众多开发者心中的地位可谓“爱不释手”&#xff0c;与其他一些计算机语言随着时间的流逝影响也逐渐减弱不同&#xff0c;Java 随着时间的推移却依然坚挺。 从首次发布开始&#xff0c;Java 就跃到了 Internet 编…

「开源项目」强大易用的开源建站工具-halo

建站工具halo 基本介绍 Halo 作为一款好用又强大的开源建站工具&#xff0c;配合上不同的模板与插件&#xff0c;可以很好地帮助你构建你心中的理想站点。它可以是你公司的官方网站&#xff0c;可以是你的个人博客&#xff0c;也可以是团队共享的知识库&#xff0c;甚至可以是一…

通过Filebeat进行日志监控

对系统的日志监控&#xff0c;通用做法是使用ELK&#xff08;Elasticsearch、Logstash、Kibana&#xff09;进行监控和搜索日志&#xff0c;这里给出另一种方案&#xff1a;通过Filebeat接收日志到Kafka&#xff0c;监控平台接收Kafka&#xff0c;并通过WebSocket实时展示。 这…

Java枚举类的构造函数

Java枚举类可以定义构造函数 Java枚举类可以定义构造函数&#xff0c;枚举常量后面括号中的参数值就是传递给构造函数的参数。 代码示例&#xff1a; package com.thb;public enum Constant {// 枚举常量后面括号中的参数值就是传递给构造函数的参数值REGISTER((byte)0x01),…

windows版docker部署springcloud项目

材料&#xff1a; 1.windows版docker环境&#xff08;其他版教程可能道理一样但是比如文件后坠名上可能有差异&#xff09; 2.运行好的数据库容器&#xff08;实现教程&#xff09; 3.所有jar包 实现&#xff1a; 最后整好的文件夹结构图&#xff08;原工程文件机密&#xf…

教你一文教你使用自己的域名远程访问内网群晖NAS+6.X【内网穿透】

文章目录 使用自己的域名远程访问内网群晖NAS 6.X【内网穿透】 使用自己的域名远程访问内网群晖NAS 6.X【内网穿透】 在之前的文章中&#xff0c;我们向大家演示了如何使用cpolar&#xff0c;创建一条固定的、能够在公共互联网登录内网群晖NAS的数据隧道。这条隧道已经能够应对…

医学案例|ROC曲线之面积对比

一、案例介绍 为评价CT和CT增强对肝癌的诊断效果&#xff0c;共检查了32例患者&#xff0c;每例患者分别用两种方法检查&#xff0c;由医生盲态按4个等级诊断&#xff0c;最后经手术病理检查确诊其中有16例患有肝癌&#xff0c;评价CT个CT增强对肝癌是有有诊断效果并且试着比较…

cpolar内网穿透工具

文章目录 cpolar内网穿透工具 cpolar内网穿透工具 科学技术的发展日新月异&#xff0c;电子设备在人们的生活中已成为不可或缺的工具&#xff0c;甚至在很多情况下&#xff0c;各类型的电子设备已经成为工作的核心&#xff0c;虽然移动设备越来越小巧&#xff0c;功能也越来越…

Lab1 datalab

修改bits.c&#xff0c;使其满足btest的测试&#xff0c;代码规范./dlc bits.c 测试 make cleanmake btest./btest bitXor 思路 题目的意思是用按位&和取反~实现异或^操作。即x和y的同一位置如果都是1或者都是0&#xff0c;那么异或之后是0&#xff0c;否则是1 x & …