对文件的各种操作详解 1

简介: 对文件的各种操作详解

一、什么是流?

在讲之前,我们得先将一下流(英文为stream),数据从设备读入内存和数据从内存写入磁盘的过程很像是数据在流动一样,所以就“形象” 地把这个过程称为“流”   我们平常使用scanf对程序中的变量进行赋值的时候就是用到了标准输入流,通过printf将内容打印到屏幕上时则是用到了标准输出流,而在c语言中,程序一旦运行起来就会自动的帮你打开三个流,标准输入流(stdin),标准输出流(stdout)和标准错误流(stderr)   所以也从来没有什么打开键盘,关闭键盘这种操作。但程序在编译的时候它总不能知道你要打开什么文件吧,因此我们需要自己打开所需要的文件,并在用完之后关闭。


二、文件的打开和关闭

1.认识fopen和fclose

abf76606f7594e18a47d5d7bbea7271b.png


函数定义均取自cplusplus.com - The C++ Resources Network

825402b5beae4d7cb6447a36b7a192c9.png


fopen函数的作用为打开文件,它有两个参数,两个都是指针指向内容不可修改的字符型指针, 在使用它的时候传的第一个参数是文件的名字,第二个参数是打开的方式。它返回的值为你打开文件所在的地址。如果文件打开失败它会返回一个空指针(NULL)。


fclose函数的作用为关闭文件,参数为一个文件指针,传参的时候就将你要关闭的那个文件的地址(通过fopen函数获得的那个地址)传过去就行   (其实本质是传对应的流过去,但这么说太抽象了)  它就会帮你关闭文件,如果关闭成功它会返回0,否则返回EOF(-1)


2.不同的打开方式

a7460d740a0349a0a2308ca5c085e89f.png


取自比特就业课


3.使用fopen和fclose

#include<stdio.h>
int main()
{
  FILE*a=fopen("abcd.txt", "r");
  //以只读的方式打开当前目录下名叫abcd.txt的文件
    //并通过文件指针a接收地址
  if (a == NULL)
  {
    perror("fopen");//错误提示
  }
  fclose(a);//将打开的文件关闭
  a = NULL;//将野指针置为空指针
}

9758ce8fa4f046108c93769a543721d3.png

在我的文件夹中现在是没有一个叫做abcd.txt的文件的也就是说,这一次打开注定是失败的,我们来试一下


02c485e2ed7d42e9a19db65682744c35.png


果然失败了,接下来我们试一下,用w的模式来打开文件,因为w的模式在文件不存在的时候也会创建一个文件

#include<stdio.h>
int main()
{
  FILE*a=fopen("abcd.txt", "w");
  //以只写的方式打开当前目录下名叫abcd.txt的文件
    //并通过文件指针a接收地址
  if (a == NULL)
  {
    perror("fopen");//错误提示
  }
  fclose(a);//将打开的文件关闭
  a = NULL;//将野指针置为空指针
}

2a9ad55a1b19434c8b3bebeab59b01ec.png


运行没有问题,接下来就让我们看下目录中是否创建出了这么一个叫abcd.txt的文件


5429ac9857c94c7a8d7d875e67b9281d.png


果然创建出来了,这不是在变魔术,也不是笔者自导自演,这是真实发生的,就是通过我们这个程序创建出来的。


三、文件的读写操作

db64ee8a0a0b48a5b5626198a0ffc363.png

1.fgetc和fputc

1.1认识fgetc和fputc


efeb554a7ee24a819d3e7a78dd5a7559.png

7bc1b7e2ea6e43fb944acb5d694801c4.png


fgetc的作用是从对应流中取出字符来,并返回对应字符的ASCII值,读取失败则是会返回EOF,fputc则是将所给的字符传入到对应的流中,如果成功获得字符则其返回值为对应的字符。


1.2使用fgetc和fputc

在使用fgetc之前,我们先用fputc将一个字符写进文件中,这样才能使用fgets从非空的文件中读取字符。

#include<stdio.h>
int main()
{
  FILE* pf=fopen("abcd.txt","w");
  //以只写的方式打开一个叫abcd.txt的文件如果文件不存在则创建该文件
  if (pf == NULL)
  {
    perror("fopen");
    return 1;
  }
  fputc('a',pf);
  //将字符a放进名字叫abcd.txt的文件中
    fclose(pf);
    pf=NULL;
}

f8dd11767a51467f998bd9bfdb2a4f16.png

可以看出,在运行程序之前abcd.txt这个文件中是什么都没有的,让我们运行一下


b8352139be5c44ec8995292c24e106c3.png


运行结束之后,a字符确实写进了abcd.txt这个文件中。


接着我们试一下fgetc,试着从流中拿字符出来,并赋值给程序中的一个变量,要注意的是fgetc在读取完字符后会自动地将文件的指针指向所读取字符的下一个字符   我们可以通过代码演示一下,这串代码的意义是从pf所指向的文件指针的内容中读取四个字符,并将它们依次打印出来。为此,我们先在abcd.txt这个文件中写一些字符,以免到时读取不到四个字符

ef42ac22307f4789abef22c1b7ea1af3.png


代码如下:

#include<stdio.h>
int main()
{
  FILE* pf = fopen("abcd.txt", "r");
  //以只读的方式打开一个叫abcd.txt的文件
  //如果文件不存在则报错
  if (pf == NULL)
  {
    perror("fopen");//错误警告
    return 1;
  }
  char ch=fgetc(pf);
  //从pf所指向的流(文件)中读取一个字符并赋给ch
  //要注意的是,当fgetc读取完字符后它会自动地将文件指针指向文件中的下一个字符
  //也就是说,你在下一次读取字符的时候会直接读到下一个字符
  printf("%c\n", ch);
  //将ch从流中读取的数据打印出来
  ch = fgetc(pf);
  printf("%c\n", ch);
  ch = fgetc(pf);
  printf("%c\n", ch);
  ch = fgetc(pf);
  printf("%c\n", ch);
  fclose(pf);//关闭文件
  pf = NULL;//将野指针置为空指针
}

运行结果如下:


d0366e81cc7246a3a0dc8eb387f4737b.png


果然依次读出了4个字符。  


相关文章
|
数据可视化 测试技术 PyTorch
智谱ChatGLM3魔搭最佳实践教程来了!
ChatGLM3-6B 是 ChatGLM 系列最新一代的开源模型,在保留了前两代模型对话流畅、部署门槛低等众多优秀特性的基础上
|
存储 编解码 算法
音视频入门基础理论知识
音视频入门基础理论知识
607 0
|
Docker 容器 Ubuntu
docker container 设置编码为utf8
以Ubuntu 14.04 为例创建编码为utf8的container
6108 0
|
11月前
|
机器学习/深度学习 编解码 弹性计算
【实践】操作系统智能助手OS Copilot新功能测评
OS Copilot 是一款致力于深度融合于操作系统的智能助手,它旨在成为用户与操作系统交互的得力助手。通过先进的自然语言处理技术和机器学习算法,OS Copilot 能够理解用户多样化的指令,将复杂的操作系统操作简单化。在日常使用场景中,无论是文件管理、应用程序的操作,还是系统设置的调整,OS Copilot 都能提供高效的支持。例如,在文件管理方面,用户无需手动在层层文件夹中查找文件,只需通过描述文件的大致信息,如创建时间、文件内容关键词等,就能快速定位到目标文件。然而,也存在一些不足,如代码生成时未使用正确后缀名、部分响应时间较长等问题。
272 8
【实践】操作系统智能助手OS Copilot新功能测评
|
9月前
|
人工智能 编解码 API
刚刚,通义万相模型能力重磅升级!
刚刚,通义万相模型能力重磅升级!
Go: struct 结构体类型和指针【学习笔记记录】
本文是Go语言中struct结构体类型和指针的学习笔记,包括结构体的定义、成员访问、使用匿名字段,以及指针变量的声明使用、指针数组定义使用和函数传参修改值的方法。
|
机器学习/深度学习 人工智能 自然语言处理
利用迁移学习加速AI模型训练
【7月更文第29天】迁移学习是一种强大的技术,允许我们利用已经训练好的模型在新的相关任务上进行快速学习。这种方法不仅可以显著减少训练时间和计算资源的需求,还能提高模型的准确率。本文将详细介绍如何利用迁移学习来加速AI模型的训练,并通过具体的案例研究来展示其在计算机视觉和自然语言处理领域的应用。
449 4
|
运维 监控 关系型数据库
阿里云Serverless高可用架构深度评测:构建稳定高效应用的全面指南
随着云计算技术的迅猛发展,Serverless计算作为一种新兴的、以事件驱动的无服务器架构,正在逐渐改变企业构建、部署和管理应用程序的方式。阿里云,作为全球领先的云服务提供商之一,提供了全面的Serverless解决方案,包括PolarDB MySQL Serverless集群和Serverless应用引擎等产品,致力于帮助用户构建高可用、高弹性、低成本的应用系统。本文将深度评测阿里云的Serverless服务,从产品功能、使用体验、部署常见问题、文档与支持的全面性等维度出发,为开发者和企业提供实用的参考。
283 0
|
Java 中间件 网络架构
分布式协调服务中间件ZooKeeper 入门(1)-ZK的介绍与特性
一、Zookeeper简介 Zookeeper是一个服务,是一个分布式协调技术,他提供高性能,分布式的协调服务。主要用来解决分布式环境当中多个进程之间的同步控制,让他们有序的去访问某种临界资源,防止造成“脏数据”的后果。
3355 88
|
前端开发 应用服务中间件 Linux
Halo博客搭建
Halo博客搭建
756 1