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


相关文章
|
1月前
|
存储 5G C语言
JavaFile实现对文件txt内容的增删该查操作
JavaFile实现对文件txt内容的增删该查操作
18 0
|
6月前
|
存储 iOS开发 C++
C++文件 I/O操作
C++文件 I/O操作
33 0
|
8月前
|
Linux 编译器 C语言
关于文件的操作
关于文件的操作
|
9月前
|
C语言
对文件的各种操作详解 3
对文件的各种操作详解
|
9月前
对文件的各种操作详解 2
对文件的各种操作详解
|
10月前
目录的操作
目录的操作
62 0
|
编译器 数据库 C语言
文件处理操作
文件处理操作
60 0
文件处理操作
|
存储 C++
C++中txt文件的读、写操作介绍
C++中txt文件的读、写操作介绍
317 0
|
开发者 Python Windows
文件的读取方式 | 学习笔记
快速学习 文件的读取方式
75 0
文件的读取方式 | 学习笔记
|
C语言
【C 语言】文件操作 ( 配置文件读写 | 写出或更新配置文件 | 函数形参设置 | 确保打开文件成功 | 统计文件大小 )
【C 语言】文件操作 ( 配置文件读写 | 写出或更新配置文件 | 函数形参设置 | 确保打开文件成功 | 统计文件大小 )
133 0