对文件的各种操作详解 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个字符。  


相关文章
|
6月前
|
存储 5G C语言
JavaFile实现对文件txt内容的增删该查操作
JavaFile实现对文件txt内容的增删该查操作
52 0
|
5月前
|
Linux
仅同步最近5分钟的文件如何操作
【6月更文挑战第28天】仅同步最近5分钟的文件如何操作
23 0
|
6月前
如何批量复制多个文件到多个目录中(批量复制文件,多对多文件高效操作的方法)
该文介绍了如何使用一个工具进行文件批量复制的操作。首先,提供了百度网盘和蓝奏云的链接,附有提取码,以获取所需工具。接着,展示了一个包含三个文件夹和两张图片的示例。操作步骤包括:打开工具,使用Ctrl+5进入批量复制模块,选择图片并拖拽至复制区域,然后选择目标文件夹(在这里是三个命名的空文件夹),点击“开始复制”,等待过程完成。工具提供复制选项供用户按需选择,且支持保存操作路径以备后续使用。完成后,目标文件夹将包含复制的图片,整个过程简便快捷。
|
存储 iOS开发 C++
C++文件 I/O操作
C++文件 I/O操作
59 0
|
Linux 编译器 C语言
关于文件的操作
关于文件的操作
|
C语言
对文件的各种操作详解 3
对文件的各种操作详解
目录的操作
目录的操作
101 0
|
开发者 Python Windows
文件的读取方式 | 学习笔记
快速学习 文件的读取方式
文件的读取方式 | 学习笔记
|
存储 C++
C++中txt文件的读、写操作介绍
C++中txt文件的读、写操作介绍
435 0