文件IO 2024.8.11

realloc函数的功能和用法

一、函数功能

realloc函数是C语言标准库中的一个函数,用于重新分配已分配内存块的大小。它既可以用来扩大已分配的内存块,也可以用来缩小内存块的大小。如果新分配的内存块大小与原始大小不同,realloc会尝试在原地扩展内存(如果可能),或者如果原地扩展不可行,则会在新的位置分配内存,并将原始数据复制到新位置。如果新分配的内存块比原始内存块小,realloc会简单地截断超出新大小的数据。

二、函数用法

//原型
void* realloc(void* ptr, size_t size);

 

  • 参数
    • ptr:指向已分配内存的指针。如果ptr是NULL,则realloc的行为与malloc相同,即分配一块新的内存。
    • size:新的内存块大小,以字节为单位。
  • 返回值
    • 如果内存分配成功,realloc返回指向新内存块的指针。这个指针可能与ptr相同(如果内存在原地扩展成功),也可能不同(如果在新位置分配了内存)。
    • 如果内存分配失败,realloc返回NULL。此时,原始的内存块ptr仍然有效,且其内容保持不变,需要用户手动释放。
  • 实现fgetc和fgets,实现fputc和fputs
  • #include <stdio.h>  
    #include <string.h>  
    #include <stdlib.h>  
      
    #define SIZE 1024  
      
    int my_fgetc(FILE *fp)   
    {    
        char c;    
        if (fread(&c, sizeof(char), 1, fp) == 1)   
        {    
            printf("my_fgetc = %c\n", c);   
            return (int)c; // 返回读取的字符  
        }    
        return EOF; // 表示读取失败或到达文件末尾  
    }  
      
    void my_fgets(FILE *fp)   
    {    
        char buf[SIZE];  
        if (fgets(buf, SIZE, fp) != NULL) {  
            printf("my_fgets = %s", buf);  
        } else {  
            printf("读取失败或到达文件末尾\n");  
        }  
    }  
      
    int my_fputc(char c, FILE *fp) // 修改参数类型为 char  
    {    
        if (fwrite(&c, 1, 1, fp) == 1)  
        {   
            return 1;    
        }    
        return -1; // 表示写入失败  
    }  
      
    int my_fputs(const char *s, FILE *fp)  
    {  
        size_t bytesWritten = fwrite(s, sizeof(char), strlen(s), fp);  
        return bytesWritten == strlen(s) ? 0 : EOF; // 0表示成功,EOF表示失败  
    }  
      
    int main(int argc, char **argv)  
    {  
        if (argc < 2) {  
            fprintf(stderr, "Usage: %s <filename>\n", argv[0]);  
            return 1;  
        }  
      
        FILE *fp1 = fopen(argv[1], "r");  
      
        if (NULL == fp1) {  
            perror("文件打开失败");  
            return 1;  
        }  
      
        // 调用函数  
        my_fgetc(fp1);  
        fseek(fp1, 0, SEEK_SET); // 重置文件指针到文件开头  
        my_fgets(fp1);  
      
        // 关闭文件指针  
        fclose(fp1);  
      
        return 0;  
    }

  • 18
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值