c语言:文件处理操作-3

简介: c语言:文件处理操作

c语言:文件处理操作-2

https://developer.aliyun.com/article/1515724


7、文件操作函数操作于屏幕的方法

细心的人应该会发现,上面所列的文件操作函数的表格中对应位所有输出输入流,那么有人应该会去思考,这些文件操作函数是否可以作用于普通的键盘输入屏幕输出操作。


继续甚于研究,其实对于任何一个c程序,只要运行起来,就会默认打开三个流:


stdin  -- 标准输入流 -- 键盘


stdout  --  标准输出流 -- 屏幕


stderr  --  标准错误流 -- 屏幕


它们三个均为FIEL*类型,也就是一个文件指针,那么我们就可以利用上面的函数对齐进行操作


那么该如何操作? 看下面的代码:

#include<stdio.h>
#include<stdlib.h>
int main()
{
  int car = fgetc(stdin);
  fputc(car, stdout);
  system("pause");
  return 0;
}


 其结果如图。输入5,输出5

相对的,对字符串的操作:

#include<stdio.h>
#include<stdlib.h>
int main()
{
  char arr[20] = { 0 };
  fgets(arr,8,stdin);
  fputs(arr, stdout);
  system("pause");
  return 0;
}


结果为:

 

8、二进制读写

1、fwrite


解释:

  • ptr指向要写入的元素的地址,
  • size_t  size 为每一个要写入元素的大小(单位:字节)
  • size_t  count 元素数
  • 如果成功写入则返回总元素数
  • 如果这个返回值于元素总数的参数不同,则表示写入错误。
  • 如果每个元素大小,或者总元素个数为0,则返回0.

我们写入一个上面写过的结构体到ilike.txt文件当中去

#include<stdio.h>
#include<stdlib.h>
struct S
{
  char name[20];
  int age;
};
int main()
{
  S a = { "xiaoxin",18 };
  FILE* pf = fopen("ilike.txt", "w");
  if (pf == NULL)
    printf("pf fopen \"ilike\" fail");
  else
  {
    fwrite(&a, sizeof(struct S), 1, pf);
    fclose(pf);
    pf = NULL;
  }
  system("pause");
  return 0;
}


打开文件如图:

因为是二进制的形式,所以用二进制读fread来读取。

2、fread

  • 从文件流中读取数据块
  • 从流中读取元素,每个元素大小为size个字节,一共读取count个元素
  • 读取到的元素将会被存储到ptr指向的内存当中
  • 如果读取成功,则返回读取到的元素的总数
  • 如果这个返回值和要读取的元素总数count不同,说明在读取玩到count个元素之前就发生了读取错误或者提前遇到了文件末尾
  • 如果size或count为0,则返回值也为0  


5cdfc907e8b6c70988b092cc8266b163_e5905d1765aa43839ac4f75627bf7dd6.png

我们继续读取上次以二进制写入的xiaoxin  18,

#include<stdio.h>
#include<stdlib.h>
struct S
{
  char name[20];
  int age;
};
int main()
{
  //S a = { "xiaoxin",18 };
  S tem = { 0 };
  FILE* pf = fopen("ilike.txt", "r");
  if (pf == NULL)
    printf("pf fopen \"ilike\" fail");
  else
  {
    //fwrite(&a, sizeof(a), 1, pf);
    fread(&tem, sizeof(tem), 1, pf);
    fclose(pf);
    pf = NULL;
  }
  printf("%s %d", tem.name, tem.age);
  
  system("pause");
  return 0;
}


结果为:

五、随机读写

也称为选择读写。如果存在一串数据“a-z”的26个小写字母,如果我不想读取字母abc三个字母,那么就要用到位置指示器(position indicator),也就是文件指针


1、fseek

fseek,顾名思义也就是,file  seek 的意思,文件搜索:

  • stream为需要操作的文件流
  • offset,偏移量,从原点偏移的字节数
  • origin,起始位置,也就是文件指针当前所指向的位置
  • 如果读取成功,函数返回0
  • 否则,返回一个非0值


这个


origin对应的有三个constant值  分别为: SEEK_SET  SEEK_CUR  SEEK_END


                                                       对应      文件头        文件中间         文件尾(EOF所在位置)


举例,我们在ilike.txt文件中写入abcdef,使用feek读取:


预测: fseek ( pf, 3 , SEEK_SET)  读取为 d

           fseek ( pf, -4 , SEEK_END)  读取为 c  


#include<stdio.h>
#include<stdlib.h>
int main()
{
  FILE* pf = fopen("ilike.txt", "r");
  if (pf == NULL)
  {
    printf("pf fopen fail");
  }
   fseek(pf, 3, SEEK_SET);
   int ch = fgetc(pf);
  printf("%c", ch);
  fseek(pf, -4, SEEK_END);
  ch = fgetc(pf);
  printf("%c", ch);
  fclose(pf);
  pf = NULL;
  system("pause");
  return 0;
}

结果为:

2、ftell

有时候对文件多次操作后,不知道文件指针指向了什么位置,这个时候就可以用ftell函数来解决

返回类型为偏移量。我们在上面的fseek代码的情况下加上ftell:

#include<stdio.h>
#include<stdlib.h>
int main()
{
  FILE* pf = fopen("ilike.txt", "r");
  if (pf == NULL)
  {
    printf("pf fopen fail");
  }
   fseek(pf, 3, SEEK_SET);
   int ch = fgetc(pf);
  printf("%c ", ch);
  fseek(pf, -4, SEEK_END);
  ch = fgetc(pf);
  printf("%c\n", ch);
  int pos = ftell(pf);
  printf("%d", pos);
  fclose(pf);
  pf = NULL;
  system("pause");
  return 0;
}

最后结果为 :3

我们可以看出来c对于起始位置的偏移量确实为3,因为c在读完之后,文件指针会向后偏移一位。


3、rewind

对于不知道文件指针最后指向什么地方,也可以使用rewind将文件指针回调到最初位置。

本次内容完......

目录
相关文章
|
3月前
|
存储 C语言 C++
C语言文件处理
C语言文件处理
36 5
|
4月前
|
语音技术 C语言 Windows
语音识别------ffmpeg的使用01,ffmpeg的安装,会做PPT很好,ffmpeg不具备直接使用,只可以操作解码数据,ffmpeg用C语言写的,得学C语言,ffmpeg的安装
语音识别------ffmpeg的使用01,ffmpeg的安装,会做PPT很好,ffmpeg不具备直接使用,只可以操作解码数据,ffmpeg用C语言写的,得学C语言,ffmpeg的安装
|
5月前
|
C语言
C语言---函数--数组---创建一个整形数组,完成对数组的3种操作
C语言---函数--数组---创建一个整形数组,完成对数组的3种操作
|
6月前
|
C语言 C++
c语言:文件处理操作-2
c语言:文件处理操作
42 0
|
6月前
|
存储 编译器 C语言
c语言:文件处理操作-1
c语言:文件处理操作
29 0
|
6月前
|
C语言 C++
C语言进阶⑭(内存函数_以字节操作)momcpy+mommove+memcmp+memset
C语言进阶⑭(内存函数_以字节操作)momcpy+mommove+memcmp+memset
60 0
|
6月前
|
存储 C语言
C语言进阶第十课 --------文件的操作-2
C语言进阶第十课 --------文件的操作
|
6月前
|
存储 编译器 C语言
C语言进阶第十课 --------文件的操作-1
C语言进阶第十课 --------文件的操作
|
1月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
33 3
|
6天前
|
C语言
c语言调用的函数的声明
被调用的函数的声明: 一个函数调用另一个函数需具备的条件: 首先被调用的函数必须是已经存在的函数,即头文件中存在或已经定义过; 如果使用库函数,一般应该在本文件开头用#include命令将调用有关库函数时在所需要用到的信息“包含”到本文件中。.h文件是头文件所用的后缀。 如果使用用户自己定义的函数,而且该函数与使用它的函数在同一个文件中,一般还应该在主调函数中对被调用的函数做声明。 如果被调用的函数定义出现在主调函数之前可以不必声明。 如果已在所有函数定义之前,在函数的外部已做了函数声明,则在各个主调函数中不必多所调用的函数在做声明
21 6