ftell函数
函数
2023-09-14 09:13:37 时间
利用返回值可以统计文件中的字节大小,不算\0
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void test01()
{
FILE* fp = fopen("hello.txt", "r");
//移动光标到文件结尾
fseek(fp, 0, SEEK_END);
//long长整型-----输出格式-----ld
long num = ftell(fp);
printf("文件中的字节大小=%ld\n", num);
//将文件中的数据读取出来,放入一个堆区数组中
char* p = (char*)malloc(num + 1);//加一存放\0
//清空内存
memset(p, 0, num + 1);
//按块读取
//参数1:数据首地址 参数2: 对结构体:块大小(普通数组:每次读取数据大小) 参数3:块个数(读取几次) 参数4:文件指针
//将文件指针移至文件开头
rewind(fp);
fread(p, num, 1, fp);
printf("%s", p);
//堆区内存手动开辟手动释放
if (p != NULL)
{
free(p);
p = NULL;
}
//关闭文件
fclose(fp);
}
int main()
{
test01();
return 0;
}
注意:当用fwrite读取文件中的字符串内容时,要用memset内存设置函数清空在堆区开辟的内存,否则会出现乱码
上面的问题只针对在堆区动态开辟的内存,因为堆区开辟的内存系统会随机赋值
一般按块读取用于结构体,子符串读取用fgets函数读取一行就不会出错,也不用加memset
但是fgets函数遇到\0结束读取,但是放入字符串中时会保留一个字节放\0
因此hello world的字节数是num,用fgets的时候,在最大字节数那里至少填num+1
fread函数不会向子符串结添加\0
下面验证:
当堆区动态开辟是时,用fgets就不用memset函数
总结:读取结构体建议用fwrite,读取字符串建议用fgets