栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言文件编辑篇

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言文件编辑篇

在课上学习了对文件的编辑

可以实现在程序中对数据的保存

在文件中对文件的编辑,以及移动位置

文件分类:


int num = 2048;
二进制文件:把数据的补码直接写入文件,这种文件叫二进制文件。
优点:读取和写入不需要转换,速度快。数据安全性高
缺点:不能使用文本编辑器打开,无法阅读。

文本文件:把数据转换为字符串写入文件,这种文件叫文本文件,能被文本编辑器打开,人类能看得懂
优点:能被文本编辑器打开,人类能看得懂,能够看出数据是否出错。
缺点:读写时需要转换,读写速度慢,数据有被修改的风险。

总结:二进制文件的大小是确定的,文本文件会根据数据的内容而变化,大小不确定。

以下是一些文件函数


打开文件:
FILE *fopen(const char *path,const char *mode);
功能:打开文件
path:文件的路径
mode:文件的打开方式
返回值:文件结构指针,是后续操作文件的凭证,失败则返回NULL。
文件的打开方式

注意:如果要操作二进制文件,则在以模式的基础上增加b

int fclose(FILE *stream);
功能:关闭文件
返回值:成功返回0,失败返回-1
注意:不能重复关闭,否则会出现double free错误,为了防止出现野指针,文件关闭后最后把文件指针赋值为NULL,及时关闭文件可以把
缓冲区中的数据写入到文件中。

文本文件的读写:
int fprintf(FILE *stream,const char *format,.....);
功能:把若干个变量写入到指定文件中
stream:要写入的文件
format:占位符+转义字符+提示信息
...:若干个变量
返回值:成功写入字符的数量

int fscanf(FILE *stream,const char *format,...);
功能:从文件中读取数据到变量中
stream:要读取的文件
format:占位符
...:若干变量的地址
返回值:成功读取的变量个数

二进制文件的读写:
注意:以二进制格式读写文件时,最好加上mode最好包含b
size_t fwrite(const void *ptr,size_t size,size_t nmemb,FILE *stream);
功能:把内存中的数据直接写入到文件中
ptr:数组首地址
size:数组元素的字节数
nmemb:数组的长度
stream:要写入的文件
返回值:成功写入的次数


size_t fread(void *ptr,size_t size,size_t nmemb,FILE *stream);
功能:把二进制文件中的内容读取到数组中
ptr:要存储数据的数组首地址
size:数组元素的字节数
nmemb:数组的容量
返回值:成功读取的次数

文件位置指针:
纪录着读写文件时的位置,读取数据时,从文件位置指针处开始读取,写入数据时也会写入到文件位置指针所指向的位置,
并且它会随着读写操作自动移动

void rewind(FILE *stream)
功能:把文件的位置指针调整到文件的开头

long ftell(FILE *stream)
功能:返回文件指针指向第几个字节

int fseek(FILE *stream,long offset,int whence);
功能:设置文件的位置指针
stream:文件
offset:指针偏移位置  +右移  -左移
whence:基础位置
    SEEK_SET 文件开头
    SEEK_CUR 当前位置
    SEEK_END 文件末尾
whence+offset就是文件指针最终设置的位置

int remove(const char *path);
功能:删除文件

int rename(const char *oldpath,const char *newpath);
功能:重命名

int truncate(const char *path,off_t length);
功能:把文件的内容设置为length字节

char *tmpnam(char *name);

int access(const char* pathname,int mode);
功能:检查文件权限
mode:
    R_OK 读权限
    W_OK 写权限
    X_OK 执行权限
    F_OK 文件是否存在
返回值:
    存在返回0
    不存在返回-1
功能:生成一个与当前文件系统不重名的文件名
程序运行时,先把数据从文件中加载内存,程序在运行期间只针对增减
然后再把内存放入文件。

函数:

文件移动

#include
#include
#include

int filemove(const char* dest_path,const char* src_path)
{
    assert(NULL!=dest_path && NULL!=src_path);
    if(0 == strcmp(dest_path,src_path))
    {
        return 0;
    }

    FILE* rtp = fopen(src_path,"r");
    if(NULL == rtp)
    {
        printf("%s 文件不存在",src_path);
        return -1;
    }
    FILE* wfp = fopen(dest_path,"w");
    if(NULL == wfp)
    {
        printf("%s 文件不存在",dest_path);
        return -1;
    }
    char buf[4096];
    int ret = 0;
    while(ret = fread(buf,1,sizeof(buf),rtp))
    {
        fwrite(buf,1,ret,wfp);
    }
    fclose(rtp);
    fclose(wfp);
    return remove(src_path);
}
int main(int argc,const char* argv[])
{
    printf("%dn",filemove("fileshort.c","1.c"));
    return 0;
}

文件拷贝

#define filemax 100
void filecopy(FILE* dest_path,FILE* src_path)
{
    assert(NULL != dest_path && NULL != src_path);
    size_t a = 0;
    void *p1 = malloc(sizeof(dest_path)*filemax);
    a = fread(p1,sizeof(dest_path),filemax,dest_path);
    fwrite(p1,sizeof(dest_path),a,src_path);
    fclose(dest_path);
    fclose(src_path);
    dest_path = NULL;
    src_path = NULL;
    free(p1);
    p1 = NULL;
}
int main(int argc,const char* argv[])
{
    FILE *dest_path = fopen("dest.dat","r");
    FILE *src_path = fopen("src.dat","w");
    filecopy(dest_path,src_path);
    return 0;
}

                                                                                                                                         学自大师兄

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1018139.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号