2024-8-9文件IO课后作业

1.realloc

realloc 是 C 语言标准库中的一个函数,用于重新分配内存块的大小。它的全称是 "reallocation",即“重新分配”。

realloc 的功能

realloc 用于调整之前分配的内存块大小。它可以扩大或缩小内存块。如果新大小大于原大小,新的内存区域不会初始化,保持未定义状态。如果新大小小于原大小,则原有的数据会被截断。

使用 realloc 的注意事项

  1. 返回值realloc 返回一个指向新分配内存的指针。如果分配失败,返回 NULL,并且原有的内存块保持不变。
  2. 可能的内存移动:新分配的内存块可能会被移动到一个新地址上。如果 realloc 成功,原来的指针可能不再有效。
  3. 释放旧内存realloc 会自动释放旧的内存块,无需手动调用 free

realloc 的常见用途

  • 动态数组:当数组需要动态调整大小时,使用 realloc 可以避免重新分配新数组并复制数据的麻烦。
  • 内存优化:在需要缩小已分配的内存块时,使用 realloc 可以减少内存使用,提高程序效率。

2.my_fputc

#include <stdio.h>
#include <stdlib.h>
int my_getc(FILE*fp)
{   unsigned char buf;
    ssize_t ret = fread(&buf,1,1,fp);
    if(1==ret)
    {
        return buf;
    }
    else
    {
        return EOF;
    }
}

int main(int argc, const char *argv[])
{
    FILE*fp=fopen("1.txt","r");
    if(NULL==fp)
    {
        printf("打开文件失败");
        return -1;
    }                                                  
    int ch;
    if((ch=my_getc(fp))!=EOF)
    {
        putchar(ch);
    }
    putchar(10);
    fclose(fp);
    return 0;
}

3.my_fputs

#include <stdio.h>                                                               
char* my_fgets(char *str, int size, FILE *fp) {
    int i = 0;
    char ch;

    // 读取最多 size - 1 个字符,保留一个位置给 \0
    while (i < size - 1) {
        if (fread(&ch, 1, 1, fp) != 1) {
            if (feof(fp)) {
                break;  // 文件结束,退出循环
            } else {
                return NULL;  // 读取错误
            }
        }
        str[i++] = ch;
        if (ch == '\n') {
            break;  // 遇到换行符,停止读取
        }
    }

    str[i] = '\0';  // 添加字符串终止符

    return i > 0 ? str : NULL;  // 如果读取到至少一个字符,返回 str,否则返回 NULL
}

int main(int argc, const char *argv[])
{
        FILE *fp = fopen(argv[1], "r");
    if(argc!=2)
    {
        printf("一次只能读取一个文件,请重新输入\n");
        return -1;
     }                                                                   
     if (fp == NULL) {
         perror("打开文件失败");
         return -1;
     }
     char buffer[100];
     if (my_fgets(buffer, sizeof(buffer), fp) != NULL) {
         printf("%s", buffer);  // 输出读取的一行数据
     }
     fclose(fp);
     return 0;
 }
 
 

4.my_fputc

#include <stdio.h>
int my_fputc(int ch, FILE *fp) {
    // 将字符作为一个字节写入文件
    size_t result = fwrite(&ch, 1, 1, fp);

    // 如果写入成功,返回写入的字符;否则返回 EOF
    return (result == 1) ? ch : EOF;
}
int main() {
    FILE *fp = fopen("output.txt", "w");
    if (fp == NULL) {                                                    
        perror("无法打开文件");
        return -1;
    }

    // 使用自定义的 my_fputc 函数写入字符
    my_fputc('H', fp);
    my_fputc('e', fp);
    my_fputc('l', fp);
    my_fputc('l', fp);
    my_fputc('o', fp);
    my_fputc('\n', fp); // 写入换行符

    fclose(fp);

    return 0;
}
                                                                                                                               

5.my_fputs

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

int my_fputs(const char *str, FILE *fp) {
    // 获取字符串长度
    size_t len = strlen(str);

    // 使用 fwrite 写入字符串,不包括终止符 \0
    size_t result = fwrite(str, 1, len, fp);

    // 如果写入的字符数量等于字符串长度,返回正值,否则返回 EOF
    return (result == len) ? (int)len : EOF;
}

int main() {                                                                   
    FILE *fp = fopen("outputs.txt", "w");
    if (fp == NULL) {
        perror("无法打开文件");
        return -1;
    }

    // 使用自定义的 my_fputs 函数写入字符串
    if (my_fputs("Hello, World!\n", fp) == EOF) {
        perror("写入失败");
    }

    fclose(fp);

    return 0;
}

                                                                               

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值