计算机文件的操作和处理(FILE*、操作函数等)

文件的分类

本文知识点对象为数据文件,文本文件:在外存中以ASCII存储,存储到内存中时需要转化为二进制。二进制文件:数据在内存中以二进制形式存储,且在外存中也以二进制形式存在。

流(stream):可以理解为一长串连续的数据,它通常用来处理数据和传输数据。有标准输入/出流、文件输入/出流、网络流等,本文主要探讨的是标准输入/出流、文件输入/出流。

FILE*文件指针、文件打开方式、fclose

每一个文件的名称、类型、存储位置的信息等都会放在一个FILE类型的结构体变量里,在内存中都有一个对应的文件信息区用以存储它们。(FILE类型由系统声明)。

文件指针:类型:FILE*,通过文件指针可以找到文件信息区,进而通过文件读写接口(文件操作函数)对文件里的内容进行读写操作。

打开文件的方式

fclose:对文件打开后,要进行关闭文件操作(同时最好将文件指针置为空指针),

:如果文件模式为读(或写),不要对它进行写(或读)的操作,否则会发生错误。

int main(){

        FILE* pf=("test.txt", "w");//只写,如果没有文件“test.txt”,将会自动生成一个

        /*

                进行写的操作。

        */

        fclose(pf);

        pf=NULL;

        return 0;

}

我们在使用printf和scanf等函数时,没有进行打开流的操作,是因为C语言程序默认打开了标准输入流(stdin,scanf从标准输入流中读取数据)、标准输出流(stdout,printf将信息输出到标准输出流上)、标准错误流(stderr)。

 文件输入/输出函数

以下函数都需包含头文件#include<stdio.h>

 典型的标准输出函数为printf,其将格式化的数据输出到标准输出流上并在控制台上打印,标准输入函数有scanf,计算机通过标准输入流(键盘输入)读取格式化的数据。

文件输入/输出函数有:

输入流 

fgetc

int fgetc (FILE* stream):从输入流中读取字符,每一次调用fgetc,文件指针都会向后移一位,返回值为该字符的ASCII值,若读取失败,将返回EOF。

fgets

char* fgets (char* str, int num, FILE* stream):从文件读取一行的num个字符放入字符串str中(不满num个也不会向下一行读取),直到读取到num个/换行符('\n')/文件末尾,并返回一个指向str的指针,若遇到文件末尾或读取错误,将返回NULL。(可以读取任何字符,包括'\n’、空格符等)。

fscanf

int fscanf (FILE* stream , const char* format, .....):从文件流中读取数据,并将解析到的数据放入相应的变量中。返回值:若成功匹配并赋值给了所有的参数,将返回参数数量,若文件流结束或发生错误,将返回EOF,若如果遇到与格式字符串不匹配的输入项,则停止扫描并返回已成功匹配的参数数量。

输出流

:如果文件打开模式进行输入不是类似于"a+"这种的而是"w",则每次打开写入的内容都会覆盖上一次的内容。

fputc

int fputc (int character, FILE* stream):参数1为要输出的字符,参数2为要指向写入的文件文件指针。

fputs 

int fputs (const char* str, FILE* stream):参数1为要写入的字符串,参数2为要指向写入的文件文件指针。

fprintf

int fprintf (FILE* stream, const char* format, .......):第一个参数为要写入的文件流,第二个参数为格式化的字符串,将其写入指定的文件流中,写入成功将返回成功写入的字符数,发生错误将返回EOF。

fread和fwrite

这两个函数操作的是二进制数据块,而不是字符,因此区别于上列函数,可以输入/出任意类型的数据,而不单单是字符。

 fread

size_t fread (void* ptr, size_t size, count, FILE* stream):参数1为指向要存储读取数据的缓冲区的指针,参数2为每个元素的字节大小,参数3为要读取的字符个数。返回值为实际读取到的字符个数。(可以读取任意类型的字符)。

fwrite

size_t fwrite (const void* str, size_t size, size_t count, FILE* stream):参数1为指向要写入的数据的指针,参数2为每个写入的元素的大小,参数3为要写入的个数。

 对文件指针位置的操作(fseek、ftell、rewind)

它们可以在任何打开模式下对文件指针进行操作"r"、"w"、"wb"等等。

fseek

int fseek (FILE*stream, long int offset, int origin):。参数3有三种:1.SEEK_SET(代表文件起始位置) 2.SEEK_CUR(代表文件指针当前的位置) 3.SEEK_END(代表文件的末尾位置)。参数2为相对于参数3代表的位置的偏移量。

ftell

long int ftell (FILE* stream):该函数的作用是找到文件指针所在的位置,并返回此时文件指针相对于起始位置的偏移量。

rewind

void  rewind (FILE* stream):作用是将文件指针移动到文件起始位置。

判读文件是否正常读取

  1. 当fgtec读取到文件末尾会返回EOF,fgets读取到末尾会返回NULL,可以参照它们的返回值判断是否读取结束。
  2. 使用feof()函数,当应用feof(fgetc)或feof(fgets),读取到文件末尾,feof会返回非负值。
  3. 使用fread,将它的返回值(实际读取到的元素个数)同文件内的元素个数比较。

完。

  • 42
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值