chapter 10 对文件的输入输出(下)

简介: chapter 10 对文件的输入输出

10.4随机读写数据文件


实际应用中,对于大批量的数据,如果想找到其中某一个人的数据。(假设整个人的数据在最后一个)按照顺寻读写,要读完前面所有数据,才能开始读写这个数据。造成的时间浪费是不可忍受的。

所以引入随机读写数据的概念。


10.4.1文件位置标记及其定位


a.文件位置标记就是:读写下一个字符的位置。

1670500847730.jpg

当开始读写文件的时候,文件位置标记指向第一个位置。

当输入第一个文件的数据时。此时位置标记往后面顺推一个位置,指向第二个位置…

所谓文件标记位置就是下面那个你想要输入的字符输入的位置。

再看


顺序读写:文件位置标记按字节位置顺序移动的读写方式

随机读写:文件标记位置按需要移动到任意位置读写的方式


流式文件:既可以顺序读写,也可以随机读写


b. 文件位置标记的定位:


1)用rewind函数使文件位置标记指向文件开头。无返回值


2)用fseek函数改变文件标记的位置


fseek(文件指针类型,位移量,起始点);
文件指针:指向某个文件
位移量:以起始点为基准,向前移动的字节数,位移量是long型数据(末尾加一个L,就代表long型数据)
起始点:用0,1,2代替。
fseek(fp,100L,0);将文件标记向前移动到离文件开头100个字节处。
fseek(fp,50L,1);将文件标记向前移动到离当前位置50个字节处
fseek(fp,-10L,2);将文件标记位置从文件末尾处向后退10个字节

1670500879199.jpg

3)用ftell函数测定文件的当前位置


从流式文件中得到标记的当前位置;
用相对于文件开头的位移量来表示;
调用出错返回-1L
i=ftell(fp);
if(i==-1L) printf("error\n");


10.4.2 随机读写(实例)


例子:有一个磁盘文件,内有一些信息。要求第一次将他的内容显示在屏幕上,第二次把他复制到另一个文件中上。

#include <stdio.h>
int main(int argc, char const *argv[])
{
   FILE *fp1 ,*fp2;
   fp1=fopen("file1.dat","r");
   fp2=fopen("file2.dat","w");
   while (!feof(fp1))
    putchar(getc(fp1));
   putchar(10);
   rewind(fp1);
   while (!feof(fp1))
    putc(getc(fp2));
    fclose(fp1);
    fclose(fp2);
    return 0;
   }


例子:在磁盘文件中存有是个学生数据。要求将第1,3,5,7,9个数据输入计算机,并且在屏幕上显示出来。

#include <stdio.h>
#include <stdlib.h>
struct student_type
{
  char name[10];
  int num;
  int age;
  char addr[15];
 } stud[10];
 int main()
 {
  int i;
  FILE *fp;
  if((fp=fopen("stu.dat","rb"))==NULL)
  {
  printf("can not open file\n");
  exit(0);
  } 
  for(i=0;i<10;i+=2)
  {
  fseek(fp,i*sizeof(struct student_type),0);
  fread(&stud[i],sizeof(struct student_type),1,fp);
  printf("%-10s %4d %4d %-15s\n",stud[i].name,stud[i].num,stud[i].age,stud[i].addr);
  }
  fclose(fp);
  return 0;
 }


10.5 文件读写的出错检测


调用某一个函数如果正确,会返回一个数值。同理,如果错误,也会返回一个数值。所以对调用函数,可以通过返回值来判断函数的正确与否。

但是除了这个还可以通过特定 函数来检查。

1.ferror ----注意是针对 文件的输入输出函数

ferror(fp);
返回0:没有出错
返回非零:出错
fp:输入输出函数中所指向的文件地址。


通过对文件结果是否出现错误来判断函数是否执行。

当打开一个文件时候,这个ferror值自动调为0,以后每次对文件操作,ferror的数值都会进行改变。

2.clearerr

每次出现错误,ferror的数值都使一个非0的数值。此时要把这个数值调为0,才能使用ferror再次去判断。使文件错误标志还有文件结束标志调为0.

相关文章
|
7月前
|
Java
Scanner与System.out为什么慢,快速输入输出模版,目录牛客.dd爱框框快速输入的代码快速输入输出快的原因 AC代码
Scanner与System.out为什么慢,快速输入输出模版,目录牛客.dd爱框框快速输入的代码快速输入输出快的原因 AC代码
|
8月前
|
XML 存储 Java
【OpenCV】—输入输出XML和YAML文件
【OpenCV】—输入输出XML和YAML文件
214 1
|
存储 C语言 索引
ENVI IDL:熟悉IDL语法+输出多幅TIFF影像的MAX文件和MEAN文件
ENVI IDL:熟悉IDL语法+输出多幅TIFF影像的MAX文件和MEAN文件
329 0
|
8月前
MFC编程 -- 读取文件内容
MFC编程 -- 读取文件内容
112 0
|
C++
C++分文件编写:拆类(.h和.cpp文件)
C++分文件编写:拆类(.h和.cpp文件)
146 0
ENVI_IDL:(批量处理)如何对HDF5文件进行GLT文件的创建并进行几何校正最终输出为IMG格式?
ENVI_IDL:(批量处理)如何对HDF5文件进行GLT文件的创建并进行几何校正最终输出为IMG格式?
196 0
|
存储 编解码
ENVI_IDL:读取OMI数据(HDF5)并输出为Geotiff文件+详细解析
ENVI_IDL:读取OMI数据(HDF5)并输出为Geotiff文件+详细解析
452 1
|
存储 编解码 Python
ENVI_IDL:对于书写和创建GEOTIFF结构体?
ENVI_IDL:对于书写和创建GEOTIFF结构体?
162 0
|
XML IDE 编译器
第一个excel VBA demo —— 添加信号并生成一段Verilog代码
第一个excel VBA demo —— 添加信号并生成一段Verilog代码
198 0
第一个excel VBA demo —— 添加信号并生成一段Verilog代码
|
存储 自然语言处理 编译器
chapter 10 对文件的输入输出(上)
chapter 10 对文件的输入输出
109 0
chapter 10 对文件的输入输出(上)

热门文章

最新文章