进阶C语言 第六章-------《文件操作》 (fgetc、fputc、fgets、fputs、fprintf、fscanf)知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏(三)

简介: 进阶C语言 第六章-------《文件操作》 (fgetc、fputc、fgets、fputs、fprintf、fscanf)知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏(三)

5.文件的随机读写

5.1.fseek

知识点:

int fseek ( FILE * stream, long int offset, int origin );

改变文件指针的指向

stream是文件信息区

offset是偏移量

origin是起始位置

起始位置可以是一下三种,SEEK_SET文件的开始、SEEK_CUR文件当前的位置、SEEK_END文件的末尾

image.png

细节:

通过实例来具体的解释

image.png

int main()
{
//省略写的步骤直接创建一个文件写好后直接使用
  FILE* pf = fopen("test.txt", "r");
  if (NULL == pf)
  {
    perror("fopen");
    return 0;
  }
  int ch = fgetc(pf);
  printf("%c\n", ch);//a
  ch = fgetc(pf);
  printf("%c\n", ch);//b
  ch = fgetc(pf);
  printf("%c\n", ch);//c
  //此时因为fgetc返回后会自动往后走一步
  //所以若想重新打印a
  //则可以通过fseek函数来实现,此时指向d应该往后偏移3步
  fseek(pf, -3, SEEK_CUR);
  ch = fgetc(pf);
  printf("%c\n", ch);//a
  return 0;
}

image.png

5.2ftell

知识点:

long int ftell ( FILE * stream );

返回此时的偏移量

细节:

很简单直接通过代码解释

image.png

5.3.rewind

知识点:

void rewind ( FILE * stream );

回到文件起始的位置

细节:

当fseek向左偏移-2打印了b后再用rewind直接回到起始位置再进行打印出a

image.png

6.文本文件和二进制文件

知识点:

二进制文件:内存中的数据是以二进制的形式存储的,如果不加以如何转化直接存到外存的文件就叫做二进制文件

文本文件:内存中的数据存储在外存前,将二进制转化成ASCII码对应的字符后再存储的文件就叫做文本文件

细节:

具体来讲就是:当我们有数值10000此时他的二进制可表示成:

00000000 00000000 00100111 00010000

若直接吧上述的二进制序列直接存储在文件中的则是二进制文件

若是把10000 分解成 5个字符 : '1' 、 '0' 、'0' 、... 后再分别把这5个字符ASCII码值进行存储的话就被称为文本文件

1ASCII码值: 49的二进制:00110001

0ASCII码值:48的二进制: 00110000 的二进制

image.png

7.文件读取结束的判定

7.1.feof函数

知识点:

当文件读取结束后可以用feof函数是用来判断读取失败的原因

细节:


fgetc读取失败返回EOF,成功返回该字符

fgets读取失败时返回NULL,把str返回(str是所要放字符串的起始位置)

fread返回实际读到的个数,所以可以通过判断返回值是否小于实际要读的个数来判断是否正确

在文件读取结束后,为了知道原因我们可以

ferror(pf)

判断是不是读取时遇到(I / O输入输出型) 错误而结束的,如果是则返回真

puts("I/O error when reading");


feof(fp))

判断是不是遇到结束标志而结束的,如果是则返回真

puts("End of file reached successfully");

具体练习:

#include <stdio.h>
enum { SIZE = 5 };
int main(void)
{
    double a[SIZE] = {1.,2.,3.,4.,5.};
    FILE *fp = fopen("test.bin", "wb"); // 必须用二进制模式
    fwrite(a, sizeof *a, SIZE, fp); // 写 double 的数组 , sizeof *a 表示的是一个元素的大小
    fclose(fp);
    double b[SIZE];
    fp = fopen("test.bin","rb");
    size_t ret_code = fread(b, sizeof *b, SIZE, fp); // 读 double 的数组
    if(ret_code == SIZE) {
        puts("Array read successfully, contents: ");
        for(int n = 0; n < SIZE; ++n) 
            printf("%f ", b[n]);
        putchar('\n');
    }     
    else { // error handling
        if (feof(fp))
            printf("Error reading test.bin: unexpected end of file\n");
        else if (ferror(fp)) {
            perror("Error reading test.bin");
        }
    }
    fclose(fp);
} 

8.文件缓冲区

知识点:

ANSIC 标准采用“缓冲文件系统”处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程序中每一个正在使用的文件开辟一块“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的大小根据C编译系统决定的。

image.png

只有当缓冲区满了或者自动刷新缓冲区(fflush(pf);函数刷新缓冲区、当fclose关闭文件时才也会刷新缓冲区)才能让数据从缓冲区去到数据区或文件 。
所以我们一定要关闭文件,否则有可能没有把数据存进文件中

本章完。预知后事如何,暂听下回分解。

相关文章
|
2天前
|
存储 C语言
C语言程序设计核心详解 第十章:位运算和c语言文件操作详解_文件操作函数
本文详细介绍了C语言中的位运算和文件操作。位运算包括按位与、或、异或、取反、左移和右移等六种运算符及其复合赋值运算符,每种运算符的功能和应用场景都有具体说明。文件操作部分则涵盖了文件的概念、分类、文件类型指针、文件的打开与关闭、读写操作及当前读写位置的调整等内容,提供了丰富的示例帮助理解。通过对本文的学习,读者可以全面掌握C语言中的位运算和文件处理技术。
|
23天前
|
C语言
【C语言篇】文件操作(下篇)
因为有缓冲区的存在,C语⾔在操作⽂件的时候,需要做刷新缓冲区或者在⽂件操作结束的时候关闭⽂ 件。如果不做,可能导致读写⽂件的问题。
|
19天前
|
存储 API 数据处理
C语言中的文件操作
C语言中的文件操作
64 0
|
23天前
|
C语言 索引
【C语言】文件操作全解速览
【C语言】文件操作全解速览
27 0
|
23天前
|
存储 程序员 C语言
【C语言篇】文件操作(上篇)
在程序设计中,我们⼀般谈的⽂件有两种:程序⽂件、数据⽂件(从⽂件功能的⻆度来分类的)。
|
29天前
|
存储 编译器 程序员
【C语言】文件操作讲解
【C语言】文件操作讲解
|
2月前
|
存储 编译器 C语言
|
2天前
|
存储 C语言
C语言程序设计核心详解 第七章 函数和预编译命令
本章介绍C语言中的函数定义与使用,以及预编译命令。主要内容包括函数的定义格式、调用方式和示例分析。C程序结构分为`main()`单框架或多子函数框架。函数不能嵌套定义但可互相调用。变量具有类型、作用范围和存储类别三种属性,其中作用范围分为局部和全局。预编译命令包括文件包含和宏定义,宏定义分为无参和带参两种形式。此外,还介绍了变量的存储类别及其特点。通过实例详细解析了函数调用过程及宏定义的应用。
|
8天前
|
Linux C语言
C语言 多进程编程(三)信号处理方式和自定义处理函数
本文详细介绍了Linux系统中进程间通信的关键机制——信号。首先解释了信号作为一种异步通知机制的特点及其主要来源,接着列举了常见的信号类型及其定义。文章进一步探讨了信号的处理流程和Linux中处理信号的方式,包括忽略信号、捕捉信号以及执行默认操作。此外,通过具体示例演示了如何创建子进程并通过信号进行控制。最后,讲解了如何通过`signal`函数自定义信号处理函数,并提供了完整的示例代码,展示了父子进程之间通过信号进行通信的过程。
|
8天前
|
C语言
C语言 字符串操作函数
本文档详细介绍了多个常用的字符串操作函数,包括 `strlen`、`strcpy`、`strncpy`、`strcat`、`strncat`、`strcmp`、`strncpy`、`sprintf`、`itoa`、`strchr`、`strspn`、`strcspn`、`strstr` 和 `strtok`。每个函数均提供了语法说明、参数解释、返回值描述及示例代码。此外,还给出了部分函数的自实现版本,帮助读者深入理解其工作原理。通过这些函数,可以轻松地进行字符串长度计算、复制、连接、比较等操作。