1.realloc
realloc
是 C 语言标准库中的一个函数,用于重新分配内存块的大小。它的全称是 "reallocation",即“重新分配”。
realloc
的功能
realloc
用于调整之前分配的内存块大小。它可以扩大或缩小内存块。如果新大小大于原大小,新的内存区域不会初始化,保持未定义状态。如果新大小小于原大小,则原有的数据会被截断。
使用 realloc
的注意事项
- 返回值:
realloc
返回一个指向新分配内存的指针。如果分配失败,返回NULL
,并且原有的内存块保持不变。 - 可能的内存移动:新分配的内存块可能会被移动到一个新地址上。如果
realloc
成功,原来的指针可能不再有效。 - 释放旧内存:
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;
}