对文件的各种操作详解 3

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

4.fscanf和fprintf

4.1认识fscanf和fprintf

fscanf的作用是将流中的数据以格式的方式输入到程序中,它有一个变量为流,另一个带...的则是参数个数不定的意思,scanf,printf函数也同样是参数个数不定的。


fprintf的作用则是将程序中的数据以格式的方式输出到流中,变量和fscanf一致。


4.2使用fscanf和fprintf

fscanf,fprintf的使用方式和scanf,printf非常相似,从变量上都可以看的出来,只是多了一个流的形式罢了,不过我可以这么跟你说,scanf,printf能做的事,fscanf和fprintf也能做,但fscanf和fprintf能做的事scanf和printf不一定可以做   因为scanf和printf仅仅只适用于标准输入流和标准输出流。而fscanf和fprintf则是可以适用于所有输入流和所有输出流。


750b3d388d554b3dbd782d5743068a75.png

453d85f0374c452fabbc36137fc86609.png


上代码:


老样子,我们还是先使用fprintf将程序中的内容输出到文件中,文件依然清空


d79fc957749947debae4b3f935aa0dd8.png


代码如下:

#include<stdio.h>
int main()
{
  FILE* pf = fopen("abcd.txt", "w");
   //以只写的方式打开abcd.txt
  if (pf == NULL)
  {
    perror("fopen");
    return 1;
  }
  int a = 3; int b = 10;
  fprintf(pf,"%d %d",a,b);
  //将a,b以int的方式输入到pf所指向的文件中
  fclose(pf);
  pf = NULL;
}


运行结果:



71cfdb7d12074311a9be503271325515.png

使用fwrite将流中的内容取出,并对程序中的变量进行修改。


文件内容如下:


f181ddbb2beb4599a849e86b68843771.png


代码如下:

#include<stdio.h>
int main()
{
  FILE* pf = fopen("abcd.txt", "r");
  //以只读的方式打开abcd.txt
  if (pf == NULL)
  {
    perror("fopen");
    return 1;
  }
  int a = 0; int b = 0;
  fscanf(pf, "%d %d", &a, &b);
  //将pf所指向的文件的内容以整型的方式输入到a,b中
  printf("a的值为%d\nb的值为%d", a,b);
  fclose(pf);
  pf = NULL;
}

运行结果如下:



1f5659b2103a445183fff4f22333b581.png


四、什么才是输入输出?

有的小伙伴因为输入输出的问题会听的很难受,完全无法理解,这里笔者就来详细的叙述一下什么才是真正的输入输出。


在很多人眼中,输入输出仅仅限于打印在屏幕上是输出,在键盘上写东西是输入,这是浅薄的认识。在我们看来,scanf的作用是通过键盘对程序中的变量进行修改,这是输入。printf的作用是打印出我们想要的东西,是输出。gets的作用是从键盘上读取字符串,是输入。puts的作用是将字符串打印在屏幕上,是输出。这些理解都没有错,但是大部分这样理解的人久而久之就会错误地认为写东西就是输入,打印东西就是输出,这太片面了。在我们c语言编程中,输入输出是相对于程序而言的,我通过程序向外面(如屏幕)输送东西叫输出,我用外面的东西(如通过键盘输入字符)向程序输入东西叫输入    这个才是输入输出的真正含义,再举一个例子,我通过程序向文件中输送数据,这叫输出(而不是你们理解的输入),我通过读写文件中的内容,输送到程序中叫输入(而不是你们理解的输出),最后再强调一遍,输入输出是站在程序的角度看的。


五、文件的随机读写

1.fseek函数

1.1认识fseek函数

6caa1f26327d40b8bde1918375b33915.png


fseek函数的作用是将流指向位置拨动到你想要的位置,三个参数,一个是流,一个代表着你要的偏移量,一个代表着你要从哪里开始偏移,只有知道了你要从哪里开始偏移你才能够知道偏移量是多少,才能知道如何才能偏移到想要的位置。返回值类型为整型,在fseek正常使用的情况下它会返回0,出错的话则返回非0值。


c260d4965b6e4a97a08ead775c3b4068.png


偏移的位置一共有三种,SEEK_SET的含义是从文件开始的位置开始偏移,SEEK_CUR的意思是从当前的流的位置开始偏移,比方说我用fgetc对一个文件成功地取出了两个字符,这个时候偏移量为0时取一个,偏移量为1时再取一个,指针也因此在此时指向了偏移量为2的位置。我这时使用SEEK_CUE就会直接从文件的这个位置开始偏移。SEEK_END的含义则是从文件的最后开始偏移(指的是从最后一个字符开始偏移)


1.2使用fseek函数

在文件中存放一串字母

50c3980511b148d589a9362e21d37bf6.png


代码如下:

#include<stdio.h>
int main()
{
  FILE* pf = fopen("abcd.txt", "r");
  //以只读的方式打开abcd.txt
  if (pf == NULL)
  {
    perror("fopen");
    return 1;
  }
  fseek(pf,3,SEEK_SET);
  char ch=fgetc(pf);
  //从pf所指向的文件开头偏移3的位置处取一个字符出来,并赋给ch
  printf("%c", ch);
  fclose(pf);
  pf = NULL;
}

运行结果如下:


ebf021d3118f4c45bf6c74e15cc4714b.png


果然取出了偏移量为3的字母d


2.ftell函数

2.1认识ftell函数


ftell函数的作用很简单,就是告诉你此时相对于最开始文件位置的偏移量是多少


2.2使用ftell函数

文件中放一串字母

c0b28e7adb98467fbb8a04915f5d2d9a.png


代码如下:

#include<stdio.h>
int main()
{
  FILE* pf = fopen("abcd.txt", "r");
  //以只读的方式打开abcd.txt
  if (pf == NULL)
  {
    perror("fopen");
    return 1;
  }
  fseek(pf,-5,SEEK_END);
  //将指针从文件最后一个字符偏移-5
  char ch = fgetc(pf);
  //取一个字符,偏移+1,偏移相对最后一个字符为-4
  //根据文件内容可知此时偏移量为7
  int a = ftell(pf);
  printf("偏移量为%d的字符为%c\n",a,ch);
  fseek(pf, 2, SEEK_CUR);
  //将指针从文件当前位置偏移2
  ch = fgetc(pf);
  //取一个字符,偏移+1
  //故此时偏移量为10
  a = ftell(pf);
  printf("偏移量为%d的字符为%c\n", a, ch);
  fclose(pf);
  pf = NULL;
}

运行结果如下:


38358a32063345c19231f4f0f450beef.png


和我们分析的一致。

3.rewind

3.1认识rewind函数

785cf9946b424ebca3f87a78273a4dbb.png


它的作用是将流的位置设置为开头


3.2使用rewind函数

还是用之前那个文件中的内容


代码如下:

#include<stdio.h>
int main()
{
  FILE* pf = fopen("abcd.txt", "r");
  //以只读的方式打开abcd.txt
  if (pf == NULL)
  {
    perror("fopen");
    return 1;
  }
  fseek(pf,-5,SEEK_END);
  //将指针从文件最后一个字符偏移-5
  char ch = fgetc(pf);
  //取一个字符,偏移+1,偏移相对最后一个字符为-4
  //根据文件内容可知此时偏移量为7
  int a = ftell(pf);
  printf("偏移量为%d的字符为%c\n",a,ch);
  fseek(pf, 2, SEEK_CUR);
  //将指针从文件当前位置偏移2
  ch = fgetc(pf);
  //取一个字符,偏移+1
  //故此时偏移量为10
  a = ftell(pf);
  printf("偏移量为%d的字符为%c\n", a, ch);
  rewind(pf);//将位置设置为开头
  ch=fgetc(pf);//从开头取一个字符给ch
  printf("%c\n",ch);
  fclose(pf);
  pf = NULL;
}

运行结果如下:


d8fe84e143c54df383370daef2256d8f.png

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