• C/C++文件操作(细节满满,part2)


    该文章上一篇:C/C++文件操作(细节满满,part1)_仍有未知等待探索的博客-CSDN博客

    个人主页仍有未知等待探索_C语言疑难,数据结构,小项目-CSDN博客

    专题分栏:C语言疑难_仍有未知等待探索的博客-CSDN博客

    目录

     

    一、引言

    二、文件的顺序

    1、输入流和输出流

    2、fputc

    1.功能

    2. 参数

    3.用法

    4.注意 

    3、fgetc

    1.功能 

    2.参数

    3.用法

    4、fputs 

    1、功能 

    2、参数

    3、用法

    5、fgets 

    ​编辑 1、功能 

    2、参数

    3、用法

    4、注意 

    6、fprintf

    1、功能 

    2、参数

    3、用法 

    7、fscanf 

    1、功能

    2、参数

    3、 用法

    8、fwrite

    ​编辑

    1、功能

    2、参数

    3、用法

    4、注意 

    9、fread 

    1、功能

    2、参数

    3、用法

    4、注意 

    三、文件的随机读写

    1、fseek

    2、ftell 

    3、rewind 

    四、二进制文件和文本文件

    五、文件读取结束的标志

    1、文本文件读取结束标志

    2、二进制文件读取结束标志

    六、文件缓冲区


     

    一、引言

    通过上篇文章,已经了解了什么是文件打开和关闭文件的操作流的概念等。

    如果对于上述的内容感到有点陌生了,不妨去看一看,文章链接在开头。

    这篇文章的内容将会包含写文件的基本操作。

    文件的顺序读写:是每次从第一个字符开始读和写。

    文件的随机读写:是每次可以从任意一个位置读和写。

    二、文件的顺序

    适用文件功能函数名适用于
    文本文件字符输入函数fgetc所有输入流
    文本文件字符输出函数fputc所有输出流
    文本文件文本行输入函数fgets所有输入流
    文本文件文本行输出函数fputs所有输出流
    文本文件格式化输入函数fscanf所有输入流
    文本文件格式化输出函数fprintf所有输出流
    二进制文件二进制输入fread文件
    二进制文件二进制输出fwrite文件

    1、输入流和输出流

    流相当于是一个过渡的过程。怎么判上述函数是输入流还是输出流呢?

    我们可以站在内存的视角来看,如果是数据流向内存,我们就可以看作是输入流。反之,则是输出流。

    就以fgetc和fputc为例:

    2、fputc

    1.功能

    将一个字符character写进stream流中。

    2. 参数

    character:字符(字符的本质就是ASCII码值,是整数)。

    stream:文件指针。

    3.用法

    1. #include
    2. int main()
    3. {
    4. //以‘只写’的方式打开文件
    5. FILE* pf = fopen("test.txt", "w");
    6. if (pf == NULL)
    7. {
    8. perror("fopen");
    9. return 0;
    10. }
    11. //处理
    12. //输入
    13. for (int i = 'a'; i <= 'z'; i++)
    14. fputc(i, pf);
    15. //关闭文件
    16. fclose(pf);
    17. pf = NULL;
    18. return 0;
    19. }

    4.注意 

    用什么方式打开文件就只能完成该功能。就比如说,以‘只写’的方式打开文件,就不能进行读取操作。

    如果对于打开方式模糊了,请点击下面链接,查看上一篇的内容:

    C/C++文件操作(细节满满,part1)_仍有未知等待探索的博客-CSDN博客

    3、fgetc

    1.功能 

     从stream流中获取数据。

    2.参数

    文件指针类型的stream流。

    3.用法

    如果获取失败,函数将返回EOF

    1. //以‘只读’的方式打开文件
    2. FILE* pf = fopen("test.txt", "r");
    3. if (pf == NULL)
    4. {
    5. perror("fopen");
    6. return 0;
    7. }
    8. //处理
    9. //输出
    10. int ch;
    11. while((ch=fgetc(pf))!=EOF)
    12. {
    13. printf("%c ",ch);
    14. }
    15. //关闭文件
    16. fclose(pf);
    17. pf = NULL;
    18. return 0;
    19. }

    4、fputs 

    1、功能 

    将一个字符串写入流中。

    2、参数

    str:需要写入文件的参数。

    stream:文件流。

    3、用法

    如果没有‘\n’的话,他会把数据输入在一行。 

    如果把文件指针pf换成stdout的话,程序会把数据打印在屏幕上。

    1. #include
    2. int main()
    3. {
    4. //以‘只写’的方式打开文件
    5. FILE* pf = fopen("test.txt", "w");
    6. if (pf == NULL)
    7. {
    8. perror("fopen");
    9. return 0;
    10. }
    11. //处理
    12. fputs("abcd", pf);//不换行写法
    13. fputs("abcd\n", pf);//换行写法
    14. fputs("abcd", stdout);//将数据打印在屏幕上
    15. //关闭文件
    16. fclose(pf);
    17. pf = NULL;
    18. return 0;
    19. }

    5、fgets 

     1、功能 

    从流中获取字符串。

    2、参数

    str:字符串。

    num:读取的个数。

    stream:文件流。

    3、用法

    如果获取失败,函数将返回EOF

    1. #include
    2. int main()
    3. {
    4. //以‘只读’的方式打开文件
    5. FILE* pf = fopen("test.txt", "r");
    6. if (pf == NULL)
    7. {
    8. perror("fopen");
    9. return 0;
    10. }
    11. //处理
    12. char str[20];
    13. fgets(str, 10, pf);
    14. printf("%s", str);
    15. //关闭文件
    16. fclose(pf);
    17. pf = NULL;
    18. return 0;
    19. }

    4、注意 

    1. 函数最多只会读取一行的数据。
    2. 当数据足够多时,参数为num,函数只会读取num-1个数据。

    6、fprintf

    1、功能 

    将格式化数据写入文件流中。

    2、参数

    通过将fprintf和printf的参数相比较,会发现,fprintf的参数就比printf的参数多了一个文件指针。 

    3、用法 

    1. #include
    2. struct S
    3. {
    4. float f;
    5. char ch;
    6. int n;
    7. };
    8. int main()
    9. {
    10. struct S s = { 4.14f,'w',1 };
    11. //以‘只 写’的方式打开文件
    12. FILE* pf = fopen("test.txt", "w");
    13. if (pf == NULL)
    14. {
    15. perror("fopen");
    16. return 0;
    17. }
    18. //处理
    19. printf("%f %c %d\n", s.f, s.ch, s.n);
    20. fprintf(pf,"%f %c %d\n", s.f, s.ch, s.n);
    21. //关闭文件
    22. fclose(pf);
    23. pf = NULL;
    24. return 0;
    25. }

    7、fscanf 

    1、功能

    从流中读取数据。

    2、参数

    fscanf和scanf的参数差不多,多了一个文件流stream。

    3、 用法

    1. #include
    2. struct S
    3. {
    4. float f;
    5. char ch;
    6. int n;
    7. };
    8. int main()
    9. {
    10. struct S s = { 4.14f,'r',1 };
    11. FILE* pf = fopen("test.txt", "r");
    12. if (pf == NULL)
    13. {
    14. perror("fopen");
    15. return 0;
    16. }
    17. //处理
    18. fscanf(pf, "%f %c %d", &(s.f), &(s.ch), &(s.n));
    19. printf("%f %c %d", s.f, s.ch, s.n);
    20. //关闭文件
    21. fclose(pf);
    22. pf = NULL;
    23. return 0;
    24. }

    8、fwrite

    1、功能

    将ptr中的数据写入流中,大小为size,个数为count。

    2、参数

    ptr:指向要写入文件流中的数据的指针。

    size:每个数据的大小。

    count:数据个数。

    stream:要写入的文件流中。

    3、用法

    1. #include
    2. int main()
    3. {
    4. FILE* pf = fopen("test.txt", "wb");//abcdef
    5. if (pf == NULL)
    6. {
    7. perror("fopen");
    8. return 0;
    9. }
    10. //处理
    11. char str[] = "abcd";
    12. fwrite(str, sizeof(char), sizeof(str) / sizeof(str[0]), pf);
    13. //关闭文件
    14. fclose(pf);
    15. pf = NULL;
    16. return 0;
    17. }

    4、注意 

    文件的打开方式要和函数匹配,要用二进制的写的方式

    9、fread 

    1、功能

    从文件流中读取数据。

    2、参数

    ptr:指向文件流中的数据所要存到的位置的指针。

    size:每个数据的大小。

    count:数据个数。

    stream:文件流。

    3、用法

    1. #include
    2. int main()
    3. {
    4. FILE* pf = fopen("test.txt", "rb");//abcdef
    5. if (pf == NULL)
    6. {
    7. perror("fopen");
    8. return 0;
    9. }
    10. //处理
    11. char str[20];
    12. fread(str, sizeof(char), sizeof(str) / sizeof(str[0]), pf);
    13. printf("%s", str);
    14. //关闭文件
    15. fclose(pf);
    16. pf = NULL;
    17. return 0;
    18. }

    4、注意 

    文件的打开方式要和函数匹配,要用二进制的读的方式

    三、文件的随机读写

    根据文件指针的位置和偏移量来确定文件指针的位置。

    文件指针当前位置
    SEEK_SETBeginning of file
    SEEK_ENDCurrent position of the file pointer
    SEEK_CUREnd of file

    1、fseek

     功能是改变文件指针的位置。

    1. #include
    2. int main()
    3. {
    4. FILE* pf = fopen("test.txt", "r");//abcdef
    5. if (pf == NULL)
    6. {
    7. perror("fopen");
    8. return 0;
    9. }
    10. //处理
    11. int ch;
    12. ch = fgetc(pf);//a
    13. printf("%c\n", ch);
    14. ch = fgetc(pf);//b
    15. printf("%c\n", ch);
    16. ch = fgetc(pf);//c
    17. printf("%c\n", ch);
    18. fseek(pf, -1, SEEK_CUR);
    19. ch = fgetc(pf);
    20. printf("%c\n", ch);//c
    21. //关闭文件
    22. fclose(pf);
    23. pf = NULL;
    24. return 0;
    25. }

    2、ftell 

    功能是返回文件当前指针的偏移量。

    1. #include
    2. int main()
    3. {
    4. FILE* pf = fopen("test.txt", "r");//abcdef
    5. if (pf == NULL)
    6. {
    7. perror("fopen");
    8. return 0;
    9. }
    10. //处理
    11. int ch;
    12. ch = fgetc(pf);//a
    13. printf("%c\n", ch);
    14. ch = fgetc(pf);//b
    15. printf("%c\n", ch);
    16. ch = fgetc(pf);//c
    17. printf("%c\n", ch);
    18. int pos = ftell(pf);
    19. printf("%d", pos);
    20. //关闭文件
    21. fclose(pf);
    22. pf = NULL;
    23. return 0;
    24. }

    3、rewind 

    功能是将文件指针返回起始位置。

    1. #include
    2. int main()
    3. {
    4. FILE* pf = fopen("test.txt", "r");//abcdef
    5. if (pf == NULL)
    6. {
    7. perror("fopen");
    8. return 0;
    9. }
    10. //处理
    11. int ch;
    12. ch = fgetc(pf);//a
    13. ch = fgetc(pf);//b
    14. ch = fgetc(pf);//c
    15. int pos = ftell(pf);
    16. printf("%d\n", pos);
    17. rewind(pf);
    18. pos = ftell(pf);
    19. printf("%d", pos);
    20. //关闭文件
    21. fclose(pf);
    22. pf = NULL;
    23. return 0;
    24. }

    四、二进制文件和文本文件

    根据数据的存储形式,文件可以分为二进制文件和文本文件。

    数据在文件中以二进制存储,就是二进制文件。

    数据在文件中以ASCII码值存储,就是文本文件。

    五、文件读取结束的标志

    在文件读取过程中,不能用feof函数的返回值直接用来判断文件的是否结束。

    1、文本文件读取结束标志

    fgetc——判断是否为EOF

    fgets——判断是否为NULL

    2、二进制文件读取结束标志

    fread——判断返回值是否小于实际要读的个数。

    六、文件缓冲区

    谢谢大家支持! 

  • 相关阅读:
    使用vLLM和ChatGLM3-6b批量推理
    手把手教你实现一个JDBC程序
    在 Spring Boot中配置日志
    Harmony Codelab 样例—弹窗基本使用
    位置变量及实例
    Kotlin MutliPatform Demo NoteApp
    面试官:Redis如何保证高可用?
    DSPE-PEG-FITC Fluorescein-PEG-DSPE 磷脂-聚乙二醇-荧光素可提高溶解度
    Vulnhub靶机:DARKHOLE_ 2
    【Java 进阶篇】JavaScript 与 HTML 的结合方式
  • 原文地址:https://blog.csdn.net/qq_73435980/article/details/133804971