文件IO(8.10)

1.realloc的使用方法 realloc 是 C 语言中用于动态内存管理的函数。它允许你调整已经分配的内存块的大小,通常用于数组的大小调整。realloc 可以增加或减少已分配内存的大小,并且可以保留旧数据的内容。

函数原型: void* realloc(void* ptr, size_t size); ptr:指向之前通过 malloc、calloc 或 realloc 分配的内存块的指针。如果 ptr 是 NULL,realloc 的行为类似于 malloc。 size:新内存块的大小,以字节为单位。如果 size 为 0,realloc 的行为类似于 free。 返回值 成功时,返回指向重新分配的内存块的指针。如果新分配的内存块位置发生了变化,则返回新的地址,旧内存块的内容会被复制到新内存块中。 如果失败,返回 NULL。原来的内存块保持不变。

示例代码: #include <stdio.h> #include <stdlib.h> int main() {    int *arr;    int initial_size = 5;    int i;    // 使用 malloc 分配初始大小    arr = (int *)malloc(initial_size * sizeof(int));    if (arr == NULL) {        fprintf(stderr, "内存分配失败\n");        return 1;    }    // 初始化数组    for (i = 0; i < initial_size; i++) {        arr[i] = i + 1;    }    // 输出初始数组内容    printf("初始数组内容:\n");    for (i = 0; i < initial_size; i++) {        printf("%d ", arr[i]);    }    printf("\n");    // 扩展数组大小    int new_size = 10;    int *new_arr = (int *)realloc(arr, new_size * sizeof(int));    if (new_arr == NULL) {        fprintf(stderr, "内存重新分配失败\n");        free(arr); // 释放原来的内存块        return 1;    }    arr = new_arr;    // 初始化新分配的内存区域    for (i = initial_size; i < new_size; i++) {        arr[i] = i + 1;    }    // 输出扩展后的数组内容    printf("扩展后的数组内容:\n");    for (i = 0; i < new_size; i++) {        printf("%d ", arr[i]);    }    printf("\n");    // 释放分配的内存    free(arr);    return 0; } 代码说明 初始分配:使用 malloc 分配一个包含 5 个 int 元素的数组。 初始化和打印数组:将数组初始化为 1 到 5,并输出内容。 重新分配内存:使用 realloc 将数组扩展到可以容纳 10 个 int 元素。原来的内容保留在新的内存块中。 扩展初始化:对新分配的内存部分进行初始化,并打印整个数组的内容。 释放内存:使用 free 释放动态分配的内存。 使用注意事项 检查返回值:realloc 可能会返回 NULL,因此需要检查返回值是否为 NULL 以防止内存泄漏。 扩展或缩小:realloc 既可以扩展内存块,也可以缩小内存块。缩小时,超出部分的内存会被释放。 内存位置变化:在扩展内存块时,realloc 可能会将数据移动到新的内存地址,因此需要将返回的指针重新赋值给原指针。 realloc 的典型用途 动态增长的数组:在运行时不确定数组的大小时,可以使用 realloc 动态调整数组的大小。 动态构建字符串:处理不断追加内容的字符串时,realloc 可以有效地管理内存。

2

2.1

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

int fgetc(FILE *stream) {
    int c;
    fread(&c, sizeof(int), 1, stream);
    return c;
}

int main() {
    FILE *stream = fopen("test.txt", "r");
    if (stream == NULL) {
        perror("fopen");
        exit(EXIT_FAILURE);
    }

    int c;
    while ((c = fgetc(stream)) != EOF) {
        printf("%c", c);
    }

    fclose(stream);
    return 0;
}
2.2

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

char *fgets(char *str, int n, FILE *stream) {
    int i;
    for (i = 0; i < n - 1 && (str[i] = fgetc(stream)) != EOF; ++i) {
        // Do nothing
    }
    if (str[i - 1] == '
') {
        str[i - 1] = '\0';
    } else {
        str[i] = '\0';
    }
    return str;
}

int main() {
    FILE *stream = fopen("test.txt", "r");
    if (stream == NULL) {
        perror("fopen");
        exit(EXIT_FAILURE);
    }

    char str[100];
    while (fgets(str, sizeof(str), stream)) {
        printf("%s", str);
    }

    fclose(stream);
    return 0;
}
3

3.1

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

int fputc(int c, FILE *stream) {
    fwrite(&c, sizeof(int), 1, stream);
    return c;
}

int main() {
    FILE *stream = fopen("output.txt", "w");
    if (stream == NULL) {
        perror("fopen");
        exit(EXIT_FAILURE);
    }

    int ch = 'A';
    fputc(ch, stream);

    fclose(stream);
    return 0;
}
3.2

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

int fputs(const char *str, FILE *stream) {
    int len = strlen(str);
    fwrite(str, sizeof(char), len, stream);
    return len;
}

int main() {
    FILE *stream = fopen("output.txt", "a");
    if (stream == NULL) {
        perror("fopen");
        exit(EXIT_FAILURE);
    }

    const char *text = "ABC";
    int written = fputs(text, stream);

    printf("Wrote %d characters
", written);

    fclose(stream);
    return 0;
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值