c++文件基本操作详解

c++文件操作

/*
2018.4.12
_文件操作详解
*/
//按数据的组织形式:
                  //文本文件:ASCII文件,每个字节存放一个字符的ASCII码
                 //二进制文件:数据按其在内存中的存储形式原样存放
//文件缓冲区:ANSI C标准采用“缓冲文件”
//文件剧本:
//文件操作API:
             //rt window下  读\n ->\r\n
            //\r\n ->\n

//按照字符读取文件 有三个已经打开 stdout stdin  stderr stderr->屏幕 打印错误信息
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string>
int main01(void)
{
    fputc('a', stdout);//stdout->屏幕 打印普通信息
    system("pause");
    char ch;
    ch = fgetc(stdin);//stdin ->键盘
    return 0;
}

int main02()
{
    //E:\\c++练习项目\\c++文件操作\\03.txt 绝对路径
    //"C:/Users" window linux 都支持
    // 相对路径 ,/,45度,./,../(建议)
    //vs:编译代码时,相对于项目工程(当前代码)
    //直接运行可执行程序,相对于程序
    // 续行符  /
    FILE *fp = NULL;
    fp = fopen("./03.txt","w+");
    if (fp == NULL)
    {
        perror("fopen");
        return -1;
    }

    if (fp!=NULL)
    {
        fclose(fp);
        fp = NULL;
    }

    return 0;
}

void  fput_c(char *path)//向文件写字符
{
    FILE *fp = NULL;
    fp = fopen(path, "w+");
    if (fp == NULL)
    {
        perror(" file fopen");
        system("pause");
    }
    char buf[] = "kdjkajda";
    if (fp != NULL)
    {
        for (int i = 0; i < strlen(buf); i++)
        {
            fputc( buf[i],fp);
        }
        fclose(fp);
    }
}
void  fget_c(char *path)//向文件读字符
{
    FILE *fp = NULL;
    fp = fopen(path, "r+");
    if (fp == NULL)
    {
        perror(" file fopen");
        system("pause");

    }
    char ch;
    while ((ch=fgetc(fp))!=EOF)
    {
        printf("%c", ch);
    }
    if (fp!=NULL)
    {
        fclose(fp);
        fp = NULL;
    }
}
void  fput_s(char *path)//向文件写字符串
{
    FILE *fp = NULL;
    fp = fopen(path, "w+");
    if (fp == NULL)
    {
        perror(" file fopen");
        system("pause");
    }
    char *buf[] = { "\nkdjkajda\n","dagdgha\n","dahdajhd\n" };
    if (fp != NULL)
    {
        for (int i = 0; i < 3; i++)
        {
            //返回值 成功shi0 失败非0
            fputs(buf[i], fp);
        }
        fclose(fp);
    }
}

void  fget_s(char *path)//向文件读字符串
{
    FILE *fp = NULL;
    fp = fopen(path, "r+");
    if (fp == NULL)
    {
        perror(" file fopen");
        system("pause");

    }
    char ch[30];
    while (!feof(fp))//文件没有结束
    {
        //sizeof(ch) ,最大值,放不下,只能放30
        //返回值 成功读取文件内容
        //把‘\n’会读取,作为换行的标志
        //fgets读取之后,自动加字符串结束符0 
        char *p=fgets(ch,sizeof(ch),fp);
        printf("%s", p);
    }
    if (fp != NULL)
    {
        fclose(fp);
        fp = NULL;
    }
}
int main03()
{
    char *test_c = "./02.txt";
    fput_c(test_c);
    fget_c(test_c);
    char *test_s = "./03.txt";
    fput_s(test_s);
    fget_s(test_s);
    system("pause");
    return 0;

}

/*
2018.4.13
按块读写文件
*/
typedef struct Stu  //这是一个块
{
    char name[30];
    int age;
};
void  fput_k(char *path)//向文件按块写字符串
{
    FILE *fp = NULL;
    fp = fopen(path, "w+");
    if (fp == NULL)
    {
        perror(" file fopen");
        system("pause");
    }
    //写文件,按块的方式写
    //s 写入文件内容的内存首地址
    //3 块数,写文件数据的大小,sizeof(stu)*3
    Stu s[3];
    char buf[50];
    for (int i = 0; i < 3; i++)
    {
        sprintf(buf, "stu%d%d%d", i, i, i);
        strcpy(s[i].name, buf);
        s[i].age = i + 1;
    }
    fwrite(s,sizeof(Stu),3,fp);//返回值 成功写入文件的块数目
    fclose(fp);
}

void  fget_k(char *path)//向文件读字符串
{
    FILE *fp = NULL;
    fp = fopen(path, "r+");
    if (fp == NULL)
    {
        perror(" file fopen");
        system("pause");

    }
    Stu s[3];
    //读文件 按块读文件
    //
    fread(s, sizeof(Stu), 3, fp);
    for (int i = 0; i < 3;i++)
    {
        printf("%s %d\n", s[i].name, s[i].age);
    }
    if (fp != NULL)
    {
        fclose(fp);
        fp = NULL;
    }
}
int main04(void)
{

    char *test_k = "./04.txt";
    fput_k(test_k);//按块写文件
    fget_k(test_k);//按块读文件
    system("pause");
    return 0;

}
/*
2018.4.13
按照格式化读写文件
*/

void  fput_g(char *path)//按格式化写字符串
{
    FILE *fp = NULL;
    fp = fopen(path, "w+");
    if (fp == NULL)
    {
        perror(" file fopen");
        system("pause");
    }
    fprintf(fp, "hellow %d", 250);  
    fclose(fp);
}

void  fget_g(char *path)//向文件读字符串
{
    FILE *fp = NULL;
    fp = fopen(path, "r+");
    if (fp == NULL)
    {
        perror(" file fopen");
        system("pause");

    }
    int a = 0;
    fscanf(fp, "hellow %d", &a);
    printf("%d",a);

    if (fp != NULL)
    {
        fclose(fp);
        fp = NULL;
    }
}
int main05(void)
{

    char *test_g = "./05.txt";
    fput_g(test_g);//按格式化写文件
    fget_g(test_g);//按格式化读文件
    system("pause");
    return 0;
}

//fseek 文件的随机读写文件
//ftell//返回:当前的读写位置
void  fget_bk(char *path)//向文件读字符串
{
    FILE *fp = NULL;
    fp = fopen(path, "r+");
    if (fp == NULL)
    {
        perror(" file fopen");
        system("pause");

    }
    Stu bmp;
    //读文件 读第三个结构体
    fseek(fp, sizeof(Stu)* 2, SEEK_SET);
    fread(&bmp, sizeof(Stu), 1, fp);
    for (int i = 0; i < 1; i++)
    {
        printf("%s %d\n", bmp.name, bmp.age);
    }
    if (fp != NULL)
    {
        fclose(fp);
        fp = NULL;
    }
}
int main(void)
{

    char *test_k = "./05.txt";
    fput_k(test_k);//按块写文件
    fget_bk(test_k);//随机位置按块读文件
    system("pause");
    return 0;

}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值