文件的随机读写

153 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第18天,点击查看活动详情

大家好,我是芒果,一名非科班的在校大学生。对C/C++、数据结构、Linux及MySql、算法等领域感兴趣,喜欢将所学知识写成博客记录下来。 希望该文章对你有所帮助!如果有错误请大佬们指正!共同学习交流

作者简介:

8.sscanf 和sprintf

sscanf:

image-20220310224545874

  • 第一个参数:字符指针(字符数组的数组名)

  • 第二个参数:scanf的格式

  • 从一个字符串读格式化数据


sprintf:

image-20220310224553387

  • 第一个参数:字符指针(字符数组的数组名)
  • 第二个参数:printf的格式
  • 写一个格式化的数据到字符串中

fprintf和fscanf时第一个参数时文件指针,现在是字符指针

sprintf和sscanf的运用

struct S
{
  int n;
    double d;
    char name[10];
};
int main()
{
    char arr[100] = {0};
    struct S s = {100,3.14,"zhangsan"};
    struct S tmp = {0};
    //把一个格式化的数据转化成字符串放到arr数组中
    sprintf(arr,"%d %lf %s",s.n,s.d,s.name);
    //打印
    printf("%s\n",arr);
    
    //从arr中的字符串提取出一个格式化的数据
    sscanf(arr,"%d %lf %s",&(tmp.n),&(tmp.d),tmp.name);
    //打印
    printf("%d %lf %s\n",tmp.n,tmp.d,tmp.name);
    return 0;
}

image-20220310224605310

把结构体变量s的每个成员的数据变成字符串放到数组中->从数组中格式化每个成员的数据->赋值回去给tmp结构体


注意:字符串数据之间要有空格,否则不能格式化提取


9.函数对比

所有输入流:包括文件流+标准输入流(键盘)

所有输出流:包括文件流+标准输出流(屏幕)


scanf:从标准输入流(键盘)读取格式化的数据

fscanf:从所有输入流读取格式化的数据

sscanf:从字符串中读取一个格式化的数据

printf:把格式化的数据输出到标准输入流(屏幕)

fprintf:把格式化的数据输出到所有输出流(屏幕/文件)上

sprintf:把格式化的数据转换成对应的字符串


10.文件的随机读写-

想在哪里开始读就在哪里开始读


fseek-根据文件指针的位置和偏移量定位文件指针

image-20220310224615836

  • 第一个参数:文件指针
  • 第二个参数:相对于第三个参数的偏移量
  • 第三个参数:起始位置,共有三种选项

image-20220310224638349

SEEK_CUR :文件指针现在指向的位置

SEEK_END :文件的末尾

SEEK_SET:文件的起始位置


假设现在文件中存放了abcdef

int main()
{
    //打开文件
    FILE* pf = fopen("test.txt","r");
    if(NULL == pf)
    {
        perror("fopen");
        return -1;
    }
    //读文件
    //随机读写
    //如果想要第一次读取就读到字符c
    fseek(pf,2,SEEK_SET);	//定位文件指针的位置,c相对于字符a,偏移量为2
    char ch = fgetc(pf);
    printf("%c\n",ch);//c
    //读取字符之后,文件指针向后偏移,指向d
    //假设现在想读取字符b
    
    fseek(pf,-2,SEEK_CUR);//字符b相对于字符d,偏移量为-2
    ch = fgetc(pf);
    printf("%c\n",ch);//b
	//读完b之后,文件指针向后偏移,指向c
    
    //3.关闭文件
    fclose(pf);
    pf = NULL;
    return 0;
}