c语言分层理解(c语言文件操作)(1)

简介: 1.文件是什么?在此电脑中的c盘和d盘中的文件夹就是文件,也就是磁盘上的文件就是文件。在程序设计中,我们需要谈论的是程序文件和数据文件。

1.文件是什么?

在此电脑中的c盘和d盘中的文件夹就是文件,也就是磁盘上的文件就是文件。在程序设计中,我们需要谈论的是程序文件和数据文件。

1.1 程序文件

源程序文件(后缀.c)、目标文件(windows环境后缀.obj)、可执行程序(后缀.exe)

1.2 数据文件

存放数据的文件

我们在学习c语言程序的时候用到的printf、scanf输入输出数据的都是以终端为对象,即从终端的键盘输入数据,运行结果显示到显

示器上。其实也可以把信息放在磁盘上,需要的时候从磁盘上把数据读到内存中使用。

1.3 文件名

文件名包括三个部分:文件路径+文件名主干+文件后缀

例如:D:\App\DingDing

2. 为什么使用文件

我们平时写的代码在运行时数据放在内存中,当程序退出的时候,数据自然就不存在了,占用的内存空间返回给了操作系统,这样当我们使用的时候就必须运行程序重新录入数据,这样使用就很麻烦。所以有不有方法让数据保留下来,我们不需要时再删除,需要的时候直接拿出来用呢?方法是有的,把数据存放在磁盘文件和数据库等方式都是可行的。这里使用磁盘文件就是把数据放在电脑磁盘上,使得数据持久化。

3. 文件的打开和关闭

3.1 文件指针

每个被使用的文件其实都在内存中开辟了一个文件信息区,用来存放文件信息。这些信息都是保存在一个结构体变量中,该结构体类型时系统声明的,类型是FILE。

那么用一张图来解释一下这个文件信息区:

3fee7cee0212a383740c07020706ff50.png

在Visual Studio 2013编译环境中合格文件结构体是这样的:

struct _iobuf {
  char* _ptr;
  int _cnt;
  char* _base;
  int _flag;
  int _file;
  int _charbuf;
  int _bufsiz;
  char* _tmpfname;
};
typedef struct _iobuf FILE;

这个struct _iobuf结构体类型重新定位为FILE,每当我们打开文件,系统就会根据文件的情况自动创建一个FILE结构体类型,填充文件信息,我们不需要关心FILE结构体中是怎么用的,怎么实现的,我们只需要知道打开文件就会出现一个对应的文件信息区,这个文件信息区是存放在内存中的,就相当于这个文件结构体类型,所以使用的时候通过文件指针找到这个文件结构体,也就是文件信息区,这里就是文件指针的概念。通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够找到与它关联的文件。

3.2 文件的打开和关闭

3.2.1 了解fopen和fclose库函数

3.2.1.1 fopen库函数

3.2.1.1.1 基本函数参数

FILE* fopen(const char* filename, const char* mode);

filename:包含要打开的文件名的C字符串(它的值应该遵循运行环境的文件名规范,可以包含路径)

mode: 包含文件访问模式的C字符串

3.2.1.1.2 注意要点
  1. 返回的指针可以通过调用fclose或freopen从文件中解关联。所有打开的文件在正常程序终止时自动关闭。
  2. 如果文件被成功打开,该函数返回一个指向file对象的指针,可用于未来操作中识别流,否则返回NULL指针。

3.2.1.2 fcolse库函数

3.2.1.2.1 基本函数参数

int fclose(FILE* stream);

stream: 指向FILE对象的指针,该对象指定要关闭的流。

3.2.1.2.2 注意要点

如果流成功关闭,则返回零值。如果失败,则返回EOF。

3.2.2 文件使用方式

1fa3f3e4d3be60baae6b37377653de07.png

3.2.3 使用

int main()
{
  //打开文件
  //打开c盘下的test文件夹中的test.txt时,在内存中映射了一块有关此文件的文件信息区,
  //这个文件信息区的类型是FILE结构体类型,然后把地址给到pf文件指针,就可以通过pf指针来访问这块文件信息区。
  FILE* pf = fopen("c:\\test\\test.txt", "w");
  if (pf == NULL)
  {
    perror("fopen():");
  }
  //关闭文件
  //关闭文件就是指通过这个文件指针关闭这个文件信息区,进而关闭此文件
  fclose(pf);
  pf = NULL;
  return 0;
}

4. 文件顺序读写

4.0 铺垫

1fa3f3e4d3be60baae6b37377653de07.png

4.1 使用函数

eccd17754cd1dac8a63158c0464e49e3.png

4.2 函数介绍

4.2.1 fgetc和fputc

4.2.1.1 fputc库函数

4.2.1.1.1 基本函数参数

int fputc ( int character, FILE * stream );

作用:将字符写入流

character:要写的字符的int提升。写入时,该值在内部转换为无符号字符

sream: 指向标识输出流的FILE对象的指针

4.2.1.1.2 注意要点
  1. 如果成功,则返回所写的字符。
  2. 如果发生写错误,则返回EOF并设置错误指示符
4.2.1.1.3 使用
#include <stdio.h>
int main()
{
  //打开文件
  //打开c盘下的test文件夹中的test.txt时,在内存中映射了一块有关此文件的文件信息区,
  //这个文件信息区的类型是FILE结构体类型,然后把地址给到pf文件指针,就可以通过pf指针来访问这块文件信息区。
  FILE* pf = fopen("c:\\test\\test.txt", "w");
  if (pf == NULL)
  {
    perror("fopen():");
    return 1;
  }
  //写入数据
  int i = 0;
  for (i = 0; i < 26; i++)
  {
    fputc('a' + i,pf);
  }
  //关闭文件
  //关闭文件就是指通过这个文件指针关闭这个文件信息区,进而关闭此文件
  fclose(pf);
  pf = NULL;
  return 0;
}

运行结果:

5f1c33b7cb065730d024c5c4fe9ceefe.png

4.2.1.2 fgetc库函数

4.2.1.2.1 基本函数参数

int fgetc ( FILE * stream );

作用:从流中获取字符

stream:指向标识输入流的FILE对象的指针

4.2.1.2.2 注意要点
  1. 如果成功,则返回已读取的字符
  2. 如果调用时流位于文件末尾,则函数返回EOF并为流设置文件末尾指示符,如果发生读错误,该函数返回EOF并为流设置错误指示符。
4.2.1.2.3 使用
#include <stdio.h>
int main()
{
  //打开文件
  //打开c盘下的test文件夹中的test.txt时,在内存中映射了一块有关此文件的文件信息区,
  //这个文件信息区的类型是FILE结构体类型,然后把地址给到pf文件指针,就可以通过pf指针来访问这块文件信息区。
  FILE* pf = fopen("c:\\test\\test.txt", "r");
  if (pf == NULL)
  {
    perror("fopen():");
    return 1;
  }
  //读取数据
  int ch = 0;
  while ((ch = fgetc(pf)) != EOF)
  {
    printf("%c ", ch);
  }
  //关闭文件
  //关闭文件就是指通过这个文件指针关闭这个文件信息区,进而关闭此文件
  fclose(pf);
  pf = NULL;
  return 0;
}

96a2b3094cc7452e72dad9bf0b64850c.png

4.2.2 fgets和fputs

4.2.2.1 fputs库函数

4.2.2.1.1 基本函数参数

int fputs ( const char * str, FILE * stream );

作用:将字符串写入流

str: 包含要写入流的内容的C字符串。

stream: 指向标识输入流的FILE对象的指针

4.2.2.1.2 注意要点

1.如果成功,则返回非负值

2.如果发生错误,该函数返回EOF并设置错误指示符(ferror)

4.2.2.1.3 使用
#include <stdio.h>
int main()
{
  //打开文件
  //打开c盘下的test文件夹中的test.txt时,在内存中映射了一块有关此文件的文件信息区,
  //这个文件信息区的类型是FILE结构体类型,然后把地址给到pf文件指针,就可以通过pf指针来访问这块文件信息区。
  FILE* pf = fopen("c:\\test\\test.txt", "w");
  if (pf == NULL)
  {
    perror("fopen():");
    return 1;
  }
  //写入数据
  fputs("hello world!\n", pf);
  char arr[] = "abcdef";
  fputs(arr, pf);
  //关闭文件
  //关闭文件就是指通过这个文件指针关闭这个文件信息区,进而关闭此文件
  fclose(pf);
  pf = NULL;
  return 0;
}

运行结果:

6076e7b4129e2d2e69bbe53e40116782.png

4.2.2.2 fgets库函数

4.2.2.2.1 基本函数参数

char * fgets ( char * str, int num, FILE * stream );

作用:从流中获取字符串

str: 指针插入到一个字符数组中,读取的字符串在其中被复制

num: 要复制到str的最大字符数(包括终止的空字符)

stream: 指向标识输入流的FILE对象的指针。

4.2.2.2.2 注意要点
  1. 如果成功,函数返回str。
  2. 如果读取字符时遇到文件结束符,则设置eof指示符。如果在读取任何字符之前发生这种情况,则返回的指针是空指针(并且str的内容保持不变)。如果发生读错误,则设置错误指示符(ferror)并返回空指针(但str所指向的内容可能已更改)






相关文章
|
15天前
|
存储 C语言
C语言文件操作(2)
【10月更文挑战第2天】
|
13天前
|
程序员 编译器 C语言
C语言底层知识------文件操作
本文详细介绍了文件操作的基本概念,包括文件的分类(程序文件和数据文件,其中着重于数据文件的文本文件和二进制文件),流的概念及其在C程序中的应用,以及标准输入输出流stdin、stdout和stderr的作用。作者通过示例展示了如何使用fopen、fclose和常见的读写函数如fgetc、fputc和fgets进行文件操作。
14 2
|
1月前
|
C语言
C语言——文件操作
本文介绍了文件的基本操作,包括文件的打开、关闭、读取和写入。使用`fopen`函数以不同模式(如“r”、“w”等)打开文件,并通过`fclose`关闭。文章详细解释了如何利用`fputc`、`fputs`及`fprintf`进行格式化写入,同时介绍了`fgetc`、`fgets`和`fscanf`用于文件内容的读取。此外,还涵盖了二进制文件的读写方法以及如何通过`fseek`、`ftell`和`rewind`实现文件的随机访问。
44 1
C语言——文件操作
|
16天前
|
存储 缓存 编译器
文件操作——C语言
文件操作——C语言
|
6天前
|
存储 C语言
简述C语言文件操作
简述C语言文件操作
6 0
|
11天前
|
存储 文件存储 C语言
深入C语言:文件操作实现局外影响程序
深入C语言:文件操作实现局外影响程序
|
16天前
|
存储 程序员 编译器
C语言文件操作(1)
【10月更文挑战第1天】
|
16天前
|
存储 C语言
C语言的文件操作
C语言的文件操作
13 0
|
18天前
|
存储 移动开发 Unix
C 语言文件操作详解
C 语言文件操作详解
|
1月前
|
存储 C语言
C语言程序设计核心详解 第十章:位运算和c语言文件操作详解_文件操作函数
本文详细介绍了C语言中的位运算和文件操作。位运算包括按位与、或、异或、取反、左移和右移等六种运算符及其复合赋值运算符,每种运算符的功能和应用场景都有具体说明。文件操作部分则涵盖了文件的概念、分类、文件类型指针、文件的打开与关闭、读写操作及当前读写位置的调整等内容,提供了丰富的示例帮助理解。通过对本文的学习,读者可以全面掌握C语言中的位运算和文件处理技术。