首页 > 其他分享 >C-文件

C-文件

时间:2023-09-09 10:33:45浏览次数:27  
标签:文件 tch int char FILE fopen

一、文件的分类:

  • 文本文件:是人能看得懂的文件,存储的是字符符号的ASCII码的二进制 '2' '5' '5'

  • 二进制文件:存储的是数据的补码二进制

255     1111 1111

二、文件IO:

  • fopen
FILE *fopen(const char *path, const char *mode);
    功能:打开或创建文件
    path:文件的路径
    mode:打开模式
        r   以只读权限打开文件,文件不存在则失败
        r+  在r的基础上增加写权限
        w   以只写权限打开文件,文件不存在则创建,存在则清空打开
        w+  在w的基础上增加读权限
        a   以只写权限打开文件,文件不存在则创建,存在则追加打开,新写入的数据在文件末尾添加
        a+  在a的基础上增加读权限
    返回值:文件指针(结构指针),不需要关心它的成员,只需要知道它是操作文件的凭证    

实例:

#include <stdio.h>

int main(int argc,const char* argv[])
{
    FILE* frp = fopen("test.txt","r+");
    if(NULL == frp)
    {
        //printf("文件打开失败!%m\n");
        perror("fopen");
    }
    else
    {
        printf("文件打开成功!\n");    
    }
}

1、二进制方式读写文件:

fwrite (把一段内存数据写入到文件中)

size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
    功能:把一段内存数据写入到文件中
    ptr:待写入的内存首地址
    size:一次写入的字节数
    nmemb:写入多少次
    stream:文件指针,fopen的返回值
    返回值:成功写入的次数    

练习1:定义一个教师结构体变量并初始化,把该变量以二进制形式写入文件中

#include <stdio.h>

typedef struct Teacher
{
    char name[20];
    char sex;
    int id;
    int wage;
}Teacher;

int main(int argc,const char* argv[])
{
    Teacher tch = {"张三",'w',1001,10};
    FILE* fwp = fopen("tch.bin","w");
    if(NULL == fwp)
    {
        perror("fopen");
        return 1;
    }
    int ret = fwrite(&tch,sizeof(tch),1,fwp);
    printf("成功写入%d次\n",ret);
}

fread(从文件中读取数据到内存中)

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
    功能:从文件中读取数据到内存中
    ptr:把文件中的数据读到该内存
    size:一次读多少字节
    nmemb:读多少次
    stream:文件指针,从该文件读取
    返回值:成功读取的次数    

练习2:定义一个教师结构体变量,从练习1写入的文件中以二进制形式读取数据到结构体变量中

#include <stdio.h>

typedef struct Teacher
{
    char name[20];
    char sex;
    int id;
    int wage;
}Teacher;

int main(int argc,const char* argv[])
{
    Teacher tch = {};
    FILE* frp = fopen("tch.bin","r");
    if(NULL == frp)
    {
        perror("fopen");
        return 1;
    }
    int ret = fread(&tch,sizeof(tch),1,frp);
    printf("%s %c %d %d\n",tch.name,tch.sex,tch.id,tch.wage);
}

2、以文本方式读写:

fprintf(以文本形式写入数据到文件中)

  int fprintf(FILE *stream, const char *format, ...);
    功能:以文本形式写入数据到文件中
    stream:要写入的文件
    format:"提示信息+占位符"
    ...:变量名列表
    返回值:成功写入的字符数  
#include <stdio.h>

int main(int argc,const char* argv[])
{
    FILE* fwp = fopen("test.txt","w");
    if(NULL == fwp)
    {
        perror("fopen");
        return 1;
    }
    int num = 10086;
    double f = 3.14;

    int ret = fprintf(fwp,"num=%d f=%lf 886\n",num,f);
    printf("ret=%d\n",ret);
}

fscanf(从文件中读取数据到变量中)

int fscanf(FILE *stream, const char *format, ...);
    功能:从文件中读取数据到变量中
    stream:要读取的文件
    format:"提示信息+占位符"
    ...:变量地址列表
    返回值:成功读取的变量个数   

实例:

#include <stdio.h>

int main(int argc,const char* argv[])
{
    FILE* frp = fopen("test.txt","r");
    if(NULL == frp)
    {
        perror("fopen");
        return -1;
    }
    int n1 = 0,n2 = 0;
    double d = 0;
    int ret = fscanf(frp,"num=%d f=%lf %d\n",&n1,&d,&n2);
    printf("ret = %d\n",ret);
    printf("%d %lf %d\n",n1,d,n2);
}

练习3:定义一个教师结构体变量并初始化,把该变量以文本形式写入文件中

#include <stdio.h>

typedef struct Teacher
{
    char name[20];
    char sex;
    int id;
    int wage;
}Teacher;

int main(int argc,const char* argv[])
{
    Teacher tch = {"张三",'w',1001,10};
    Teacher tch1 = {};

    FILE* fwp = fopen("tch.txt","w+");
    if(NULL == fwp)
    {
        perror("fopen");
        return 1;
    }
    fprintf(fwp,"%s %c %d %d\n",tch.name,tch.sex,tch.id,tch.wage);

    //fseek(fwp,-17,SEEK_END);
//    rewind(fwp);
    printf("filesize=%ld\n",ftell(fwp));
    fscanf(fwp,"%s %c %d %d\n",tch1.name,&tch1.sex,&tch1.id,&tch1.wage);
    printf("%s %c %d %d\n",tch1.name,tch1.sex,tch1.id,tch1.wage);
}

练习4:从文件中读取教师数据到结构变量中并显示

#include <stdio.h>

typedef struct Teacher
{
    char name[20];
    char sex;
    int id;
    int wage;
}Teacher;

int main(int argc,const char* argv[])
{
    Teacher tch = {};
    FILE* frp = fopen("tch.txt","r");
    if(NULL == frp)
    {
        perror("fopen");
        return 1;
    }
    fscanf(frp,"%s %c %d %d\n",tch.name,&tch.sex,&tch.id,&tch.wage);
    printf("%s %c %d %d\n",tch.name,tch.sex,tch.id,tch.wage);

}

3、关闭文件fclose

int fclose(FILE *stream);
    功能:关闭文件    

注意:文件读写有有缓冲区机制,想要立即写入,需要关闭文件后才能看到

三、文件位置指针及相关函数

每个打开的文件都有一个指针记录这读写操作的位置,它会随着读写函数的执行而自动移动,所以以r、r+、w、w+方式打开文件位置指针默认在文件开头,以a、a+方式打开文件位置指针默认在文件末尾

平时顺序读写时不用关注位置指针,当需要随机读写文件时可以通过手动设置文件指针的位置来进行

  • fseek 设置文件位置指针的位置
int fseek(FILE *stream, long offset, int whence);
    功能:设置文件位置指针的位置
    stream:要设置的文件
    offset:偏移值
    whence:基础位置
        SEEK_SET    文件开头
        SEEK_CUR    当前位置
        SEEK_END    文件末尾
    返回值:成功返回0,失败返回-1    
  • rewind 把文件位置指针设置到文件开头
void rewind(FILE *stream);
    功能:把文件位置指针设置到文件开头    
  • ftell 获取文件位置指针的位置
long ftell(FILE *stream);
    功能:获取文件位置指针的位置
    返回值:位置指针在第几字节    
  • fgets 从文件中读取一行长度为size-1的字符串到s
  char *fgets(char *s, int size, FILE *stream);

    功能:从文件中读取一行长度为size-1的字符串到s  
  • fputs 写入一个字符串到文件中,会自动在末尾添加 '\n'
int fputs(const char *s, FILE *stream);
    功能:写入一个字符串到文件中,会自动在末尾添加 '\n'
    返回值:成功写入的字符个数    
  • remove 删除文件
int remove(const char *pathname);
    功能:删除文件
    pathname:建议写绝对路径
    返回值:成功返回0,失败返回-1   
  • rename 重命名文件
int rename(const char *oldpath, const char *newpath);
    功能:重命名文件
    返回值:成功返回0,失败返回-1   

main函数参数:也叫命令行参数

argc:代表了命令行提供的参数个数 ./a.out 也算一个

argv:按顺序以字符串形式存储每个命令行参数

练习:实现cp的功能

CP dest     src

argv[1]  argv[2]

#include <stdio.h>

int main(int argc,const char* argv[])
{
    if(3 != argc)
    {
        printf("User: ./CP dest src\n");
        return 0;
    }

    //    读打开dest  写打开src
    FILE* dest = fopen(argv[1],"r");
    if(NULL == dest)
    {
        printf("原文件不存在,请检查!\n");
        return 0;
    }

    FILE* src = fopen(argv[2],"r");
    if(src)
    {
        //    src存在,则提醒是否覆盖
        printf("目标文件已存在,是否覆盖(y/n)?");
        char cmd = getchar();
        if('y' != cmd && 'Y' != cmd)
        {
            printf("拷贝停止!\n");
            fclose(dest);
            fclose(src);
            return 0;
        }
    }
    src = fopen(argv[2],"w");
    if(NULL == src)
    {
        printf("创建文件失败,检查权限!\n");
        fclose(dest);
        return 0;
    }

    //    二进制 一边读一边写 
    char buf[256] = {};
    int ret = 0;
    while(0 < (ret = fread(buf,1,sizeof(buf),dest)))
    {
        fwrite(buf,1,ret,src);    
    }

    //    关闭文件
    fclose(dest);
    fclose(src);
}


标签:文件,tch,int,char,FILE,fopen
From: https://www.cnblogs.com/ljf-0804/p/17688994.html

相关文章

  • 配置文件加载模块-单例配置类设计
    classConfig{有我们单例模式所需要的一些信息,首先向外提供一个统一的访问接口,然后在类内实例化一个访问对象//使用的是懒汉模式,涉及到线程安全问题,用的时候才去进行加载,所以要加锁private:staticstd::mutex_mutex;//互斥锁,来保护对象实例化的一个过程Config*_instance;//......
  • springMVC的xml文件配置
    <?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/sc......
  • py文件转换成exe文件在windows上允运行 有没有什么好方法?
    大家好,我是皮皮。一、前言前几天在Python最强王者群【哎呦喂 是豆子~】问了一个Python打包的问题,一起来看看吧。py文件转换成exe文件在windows上允运行有没有什么好方法?window上没有python。二、实现过程这里【瑜亮老师】给了一个思路和指导,如下:把用到的库你复制过去,开始......
  • # yyds干货盘点 # py文件转换成exe文件在windows上允运行 有没有什么好方法?
    大家好,我是皮皮。一、前言前几天在Python最强王者群【哎呦喂 是豆子~】问了一个Python打包的问题,一起来看看吧。py文件转换成exe文件在windows上允运行有没有什么好方法?window上没有python。二、实现过程这里【瑜亮老师】给了一个思路和指导,如下:把用到的库你复制过去,开始打包。【......
  • uniapp项目实践总结(十三)封装文件操作方法
    导语:在日常APP开发过程中,经常要进行文件的保存、读取列表以及查看和删除文件等操作,接下来就看一下具体的方法。目录原理分析方法实现实战演练案例展示原理分析主要是以下API。uni.saveFile:保存文件到本地缓存列表;uni.getSavedFileList:获取保存文件列表;uni.getSa......
  • 如何取消VSCODE文件夹折叠
    1.问题如图所示,文件夹折叠在一起,导致我无法在父文件夹中新建一个文件夹,而是只能在子文件夹中新建文件夹2.解决原因:文件夹以紧凑方式呈现,取消即可1.打开设置,在里面搜索Explorer:CompactFolders2.取消勾选即可......
  • Linux系统文件夹权限以及shell外壳的理解
    文件是什么和文件权限的简单理解首先我们要知道对于Linux中的文件而言一个文件=属性+内容。并且对于一个操作系统的使用人员而言,一个文件具有三种权限,分别是可读,可写,可执行。并且操作系统对于每一个用户(除了root权限)对于一个文件而言会倍分成不同的组。对于文件的创建者而言,Linux......
  • Palo Alto防火墙---安全配置文件篇
    老板:楼小楼,据某员工反映他的邮箱自动向其他人发送了一些邮件,这个员工的邮箱密码只有他自己知道,并没有告诉给任何人。楼小楼:老板,这种情况一般是他的邮箱被人暴力破-解了,并且如果不采取措施,那么其他人的邮箱也有被暴力破-解的可能!老板:什么?有这么严重?楼小楼:当然,我们公司有很多服务器,现......
  • ES6 Module模块,在vsCode中已服务器模式运行HTML文件
    操作步骤如下:一、安装LiveServer插件二、点击扩展设置三、设置liveserver默认打开浏览器为“chrome”四、配置-工作区五、在HTML文件中,右键选择"openwithLiveServer" 输出结果 ......
  • WPF 获取资源文件帮助类
    usingSystem;usingSystem.Reflection;usingSystem.Windows;namespaceK.Controls.Controls.Helper{publicclassResourceHelper{privatestaticResourceDictionary_theme;internalstaticTGetResourceInternal<T>(stringkey)......