C语言之文件的读写(1)

简介: C语言之文件的读写(1)

前面三部分已经给大家介绍过了,网址发给大家方便大家复习

打开方式如下:

文件使用方式 含义 如果指定文件不存在

“r”(只读) 为了输入数据,打开一个已经存在的文本文件 出错

“w”(只写) 为了输出数据,打开一个文本文件 建立一个新的文件

“a”(追加) 向文本文件尾添加数据 建立一个新的文件

“rb”(只读) 为了输入数据,打开一个二进制文件 出错

“wb”(只写) 为了输出数据,打开一个二进制文件 建立一个新的文件

“ab”(追加) 向一个二进制文件尾添加数据 建立一个新的文件

“r+”(读写) 为了读和写,打开一个文本文件 出错

“w+”(读写) 为了读和写,建议一个新的文件 建立一个新的文件

“a+”(读写) 打开一个文件,在文件尾进行读写 建立一个新的文件

“rb+”(读写) 为了读和写打开一个二进制文件 出错

“wb+”(读写) 为了读和写,新建一个新的二进制文件 建立一个新的文件

“ab+”(读写) 打开一个二进制文件,在文件尾进行读和写 建立一个新的文件

实例代码:


/* fopen fclose example */
#include <stdio.h>
int main ()
{
  FILE * pFile;
  //打开文件
  pFile = fopen ("myfile.txt","w");
  //文件操作
  if (pFile!=NULL)
 {
    fputs ("fopen example",pFile);
    //关闭文件
    fclose (pFile);
 }
  return 0;
}

4. 文件的顺序读写

4.1 顺序读写函数介绍

功能 函数名 适用于

字符输入函数 fgetc 所有输入流

字符输出函数 fputc 所有输出流

文本行输入函数 fgets 所有输入流

文本行输出函数 fputs 所有输出流

格式化输入函数 fscanf 所有输入流

格式化输出函数 fprintf 所有输出流

二进制输入 fread 文件

二进制输出 fwrite 文件


#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//#include<stdlib.h>
#include<errno.h>
#include<string.h>
int main()
{
  FILE* pf = fopen("test.txt", "w");//定义一个变量pf,pf指向这个文件信息区,文件信息区和文件本身相关联,这时候我们就可以读或者写或者对文件做一些其他的事情等等
  if (pf == NULL)
  {
    printf("%s\n", strerror(errno));
    return 1;
  }
  //写文件
  //......
  //关闭文件
  fclose(pf);
  pf = NULL;//设置成空指针使其再也找不到这块空间
  return 0;
}

这里有同学可能会问,为什么要关闭pf所指向的这个文件呢?

这是因为文件也是资源,最后你把文件关闭掉也就是将资源释放掉了,一个程序能打开的文件个数是有数的,并不是说可以无限打开,我打开之后关闭了以便我后期打开更多的文件,而且如果你不关闭这个文件可能会造成数据的丢失等等,所以一定要关闭文件并且置为NULL

fputc函数

b71fee18b26c4e2292e063716ddd7679.png

大家来看代码


#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//#include<stdlib.h>
#include<errno.h>
#include<string.h>
int main()
{
  FILE* pf = fopen("test.txt", "w");
  if (pf == NULL)
  {
    printf("%s\n", strerror(errno));
    return 1;
  }
  char i = 0;
  for (i = 'a'; i <= 'z'; i++)
  {
    fputc(i, pf);
  }
  //写文件
  //......
  //关闭文件
  fclose(pf);
  pf = NULL;//设置成空指针使其再也找不到这块空间
  return 0;
}

大家可以将代码拷贝一份去自己测试一下

这个时候我们再打开test.txt文件来看一看我们刚才的26个字母是否都已经写到文件里面了

eafff323c3444fe0bbc9c1ffcf5e9da7.png

大家看,结果属实

现在我们要以字符的形式将我的我的文件里的字符都拿出来,这个时候就要用到fgetc函数

fgetc函数

244e3e1b29bd4c5293d5b6f035d7b9cf.png

dd73b1fab1fc4b999dcb11fc68fa2f30.png

简言之,如果读到一个错的字符就返回EOF

现在我们来看代码


#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//#include<stdlib.h>
#include<errno.h>
#include<string.h>
int main()
{
  FILE* pf = fopen("test.txt", "r");
  if (pf == NULL)
  {
    printf("%s\n", strerror(errno));
    return 1;
  }
  int ch = 0;
  while ((ch = fgetc(pf)) != EOF)
  {
    printf("%c ", ch);
  }
  //char i = 0;
  //for (i = 'a'; i <= 'z'; i++)
  //{
  //  fputc(i, pf);
  //}
  //写文件
  //......
  //关闭文件
  fclose(pf);
  pf = NULL;//设置成空指针使其再也找不到这块空间
  return 0;
}

3a02da9a88cd4e93abf1036cf3ccc0a9.png

大家看fgetc就把文件里面的所有字符都读取出来了

现在呢我们写一行数据,这个时候就要用到fputs函数

fputs函数

d0c7c8f9390c4d2eac4c73babde05ab1.png

const char * str, FILE * stream

Write string to stream这里的意思是将字符串写到流(也就是文件)里面去

9d915eae41334f2bba22272bfbe0d1f8.png

大家看,大家可能就有疑问了,我们刚才不是写了26个英文字母吗,为什么这里的26个字母不见了呢?这是因为你再次向文件里面写数据的时候,会自动将你原来文件里面写的东西全部清空然后重新写,希望大家能够理解


#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//#include<stdlib.h>
#include<errno.h>
#include<string.h>
int main()
{
  FILE* pf = fopen("test.txt", "w");//"w"改成"a"的时候是追加的意思。我们来看下面的图片
  if (pf == NULL)
  {
    printf("%s\n", strerror(errno));
    return 1;
  }
  fputs("hello bit", pf);
  //int ch = 0;
  //while ((ch = fgetc(pf)) != EOF)
  //{
  //  printf("%c ", ch);
  //}
  //char i = 0;
  //for (i = 'a'; i <= 'z'; i++)
  //{
  //  fputc(i, pf);
  //}
  //写文件
  //......
  //关闭文件
  fclose(pf);
  pf = NULL;//设置成空指针使其再也找不到这块空间
  return 0;
}

FILE pf = fopen(“test.txt”, “w”);//"w"改成"a"的时候是追加的意思。我们来看下面的图片*

dd1c9913bd474f9c97a81e987e1ed852.png

现在我们要随机读一行数据应该怎么办呢,所以我们引入fgets函数

fgets函数

260e24dbda3f484cb666e80a065f9732.png43a29f5a76d64280afb5276f1129c268.png


读到的字符串将会拷贝到str指向的空间的位置

最多的字符的个数将会被拷贝到str里面

089b25f3c9644979b008f013fd5d5df3.png

大家可以尝试着自己理解一下


#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//#include<stdlib.h>
#include<errno.h>
#include<string.h>
int main()
{
  FILE* pf = fopen("test.txt", "r");
  if (pf == NULL)
  {
    printf("%s\n", strerror(errno));
    return 1;
  }
  char arr[20];
  fgets(arr, 5, pf);
  printf("%s\n", arr);//放5的时候最多能够读到4个
  fclose(pf);
  pf = NULL;//设置成空指针使其再也找不到这块空间
  return 0;
}

4fa6dbf466be4c2b940b8bb4373b62e2.png

3be032bd8cf646038751f64a506ee1a3.png

这里给大家介绍一下perror这个函数,用起来更方便一些

perror函数


#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//#include<stdlib.h>
#include<errno.h>
#include<string.h>
int main()
{
  FILE* pf = fopen("test", "r");
  if (pf == NULL)
  {
    //printf("%s\n", strerror(errno));
    perror("fopen");
    return 1;
  }
  char arr[20];
  fgets(arr, 5, pf);
  printf("%s\n", arr);//放5的时候最多能够读到4个
  fclose(pf);
  pf = NULL;//设置成空指针使其再也找不到这块空间
  return 0;
}

/这里给大家介绍一下fprintf函数

fprintf函数

3d0d649aeb7245508321803b543084d9.png

e709a8f80dc94dd0ada1a53effafaf89.png

将代码给大家

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//#include<stdlib.h>
#include<errno.h>
#include<string.h>
struct S
{
  char arr[20];
  int age;
  float score;
};
int main()
{
  struct S s = { "zhangsan",25,50.5f };
  FILE* pf = fopen("test.txt", "w");
  if (pf == NULL)
  {
    //printf("%s\n", strerror(errno));
    perror("fopen");
    return 1;
  }
  fprintf(pf, "%s %d %f", s.arr, s.age, s.score);//fprintf将数据写到文件里面去
  fclose(pf);
  pf = NULL;//设置成空指针使其再也找不到这块空间
  return 0;
}

如果想要把数据从文件中读出来,这里就必须引入fscanf函数

fscanf函数

117c202184eb4366a37d0142e0f3dd91.png

2b772229d8d545088c266d3ea0387c22.png

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//#include<stdlib.h>
#include<errno.h>
#include<string.h>
struct S
{
  char arr[20];
  int age;
  float score;
};
int main()
{
  struct S s = { "zhangsan",25,50.5f };
  FILE* pf = fopen("test.txt", "w");
  if (pf == NULL)
  {
    //printf("%s\n", strerror(errno));
    perror("fopen");
    return 1;
  }
  fscanf(pf, "%s %d %f", s.arr, (&s.age), &(s.score));//fscanf从文件里面去读,将信息从pf指向的文件读出来放到s里面去,再将其打印出来
  printf("%s %d %f", s.arr, s.age, s.score);
  fclose(pf);
  pf = NULL;//设置成空指针使其再也找不到这块空间
  return 0;
}

fwrite函数的介绍

fwrite函数

66a5a2fe3a5148c4af8989550fd2688c.png

f08e5d4fc2a843bda0309f3e6d7530cc.png

这个时候你发现你有一些东西是看不懂的,这是因为这是以二进制的形式写进去的

我们以二进制的形式写进去那么就可以以二进制的形式读出来,这时候就要引入fread函数

fread函数

b7c08a161207417daf55994e1da9de99.png

我们以二进制的形式写进去,我们就可以已二进制的形式读出来

562bc8585d214843aa0a6af585dcf0dd.png


#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//#include<stdlib.h>
#include<errno.h>
#include<string.h>
struct S
{
  char arr[20];
  int age;
  float score;
};
int main()
{
  struct S s = { "zhangsan",25,50.5f };
  FILE* pf = fopen("test.txt", "wb");
  if (pf == NULL)
  {
    perror("fopen");
    return 1;
  }
  //fwrite(&s, sizeof(struct S), 1, pf);
  fread(&s, sizeof(struct S), 1, pf);
  printf("%s %d %f\n", s.arr, s.age, s.score);
  fclose(pf);
  pf = NULL;//设置成空指针使其再也找不到这块空间
  return 0;
}

本章终!


相关文章
|
13天前
|
存储 编译器 C语言
如何在 C 语言中判断文件缓冲区是否需要刷新?
在C语言中,可以通过检查文件流的内部状态或使用`fflush`函数尝试刷新缓冲区来判断文件缓冲区是否需要刷新。通常,当缓冲区满、遇到换行符或显式调用`fflush`时,缓冲区会自动刷新。
|
13天前
|
存储 编译器 C语言
C语言:文件缓冲区刷新方式有几种
C语言中文件缓冲区的刷新方式主要包括三种:自动刷新(如遇到换行符或缓冲区满)、显式调用 fflush() 函数强制刷新、以及关闭文件时自动刷新。这些方法确保数据及时写入文件。
|
1月前
|
C语言
【C语言】探索文件读写函数的全貌(三)
【C语言】探索文件读写函数的全貌
|
1月前
|
存储 C语言
【C语言】探索文件读写函数的全貌(二)
【C语言】探索文件读写函数的全貌
|
1月前
|
C语言
【C语言】探索文件读写函数的全貌(一)
【C语言】探索文件读写函数的全貌
|
1月前
|
存储 文件存储 C语言
【C语言】深入了解文件:简明指南
【C语言】深入了解文件:简明指南
|
2月前
|
Linux C语言
C语言 文件IO (系统调用)
本文介绍了Linux系统调用中的文件I/O操作,包括文件描述符、`open`、`read`、`write`、`lseek`、`close`、`dup`、`dup2`等函数,以及如何获取文件属性信息(`stat`)、用户信息(`getpwuid`)和组信息(`getgrgid`)。此外还介绍了目录操作函数如`opendir`、`readdir`、`rewinddir`和`closedir`,并提供了相关示例代码。系统调用直接与内核交互,没有缓冲机制,效率相对较低,但实时性更高。
|
3月前
|
存储 C语言
【C语言】C语言-学生成绩管理系统(源码+数据文件+课程论文)【独一无二】
【C语言】C语言-学生成绩管理系统(源码+数据文件+课程论文)【独一无二】
51 15
|
3月前
|
存储 C语言
【c语言】职工信息管理系统 包含读取写入txt文件,职工信息的增删改查
【c语言】职工信息管理系统 包含读取写入txt文件,职工信息的增删改查
|
3月前
|
存储 自然语言处理 程序员
【C语言】文件的编译链接和预处理
【C语言】文件的编译链接和预处理