C语言——打开和关闭文件、读写文件、随机读写文件、可移植性问题

目录

一、打开和关闭文件

1.文件

2.文本文件和二进制文件

3.打开和关闭文件

二、读写模式 

1.读写单个字符(fgetc和getc、fputc和putc)

2.读写整个字符串(fgets和fputs)

3.格式化读写文件(fscanf和fprintf)

4.二进制读写文件(fread和fwrite)

三、随机读写文件(fseek)

四、可移植性问题


一、打开和关闭文件

1.文件

        计算机文件(或称文件、电脑档案、档亲),是存储在某种长期储存设备或临时存储设备中的一段数据流,并且归属于计算机文件系统管理之下。所谓“长期储存设备”一般指磁盘、光盘、磁带等。而“短期存储设备”一般指计算机内存。需要注意的是,存储于长期存储设备的文件不一定是长期存储的,有些也可能是程序或条统运行中产生的临时数据,并于程序或系统退出后删除。

2.文本文件和二进制文件

        C语言的文件主要有两种,一种是咱们看得懂的,一种是看不懂的。看得懂的是文本文件,由一些字符的序到组成的;另一种是二进制文件,通常是指除了文本文件以外的文件。

3.打开和关闭文件

  • 只有在一个文件被打开的时候,才能够对其进行读写操作。
  • “读”就是从文件里获取数据,“写”则相反,是将数据写入到文件里面。
  • 在完成对一个文件的读写操作之后,必须将其关闭

二、读写模式 

1.读写单个字符(fgetc和getc、fputc和putc)

(1)fgetc和getc

  • fgetc函数用于从文件流中读取下一个字符并推进文件的位置指示器(用来指示接下来要读写的下一个字符的位置)。
  • 参数stream:该参数是一个FILE对象的指针,指定一个待读取的文件流
  • 返回值:① 该函数将读取到的 unsigned char 类型转换为 int 类型并返回;② 如果文件结束或者遇到错误则返回EOF。

备注:

  • fgetc函数和getc幽数两个的功能和描述基本上是一模一样的,它们的区别主要在于实现上:fgetc是一个幽数;而getc则是一个宏的实现;
  • 一般来说宏产生较大的代码,但是避免了函数调用的堆栈操作,所以速度会比较快;
  • 由于getc是由宏实现的,对其参数可能有不止一次的调用,所以不能使用带有副作用(side effects)的参数。

(2)fputc和putc

  • fputc函数用于将一个字符写入到指定的文件中并推进文件的位置指示器(用来指示接下来要读写的下一个李符的位置)。
  • 参数:①c:指定待写入的字符;②stream:该参数是一个FILE对象的指针,指定一个待写入的文件流。
  • 返回值:① 如果函数没有错误,返回值是写入的字符;② 如果函数发生错误,返回值是EOF。

备注:

  • fputc函数和putc函数两个的功能和描述基本上是一模一样的,它们的区别主要在于实现上:fputc是一个函数;而putc则是一个宏的实现;
  • 一般来说宏产生较大的代码,但是避免了函数调用的堆栈操作,所以速度会比较快;
  • 由于putc是由宏实现的,对其参数可能有不止一次的调用,所以不能使用带有副作用(side effects)的参数。

2.读写整个字符串(fgets和fputs)

(1)fgets

  • fgets函数用于从指定文件中读取字符串。
  • fgets函数最多可以读取  size - 1  个字符,因为结尾处会自动添加一个字符串结束符'\n',当读取到换行符('\n')或文件结束符(EOF)时,表示结束读取('\n'会被作为一个合法的字符读取)。
  • 参数:① s:字符型指针,指向用于存放读取字符串的位置;② size:指定读取的字符致(包括最后自动添加的'\n');③ stream:该参数是一个FILE对象的指针,指定一个待操作的数据流。
  • 返回值:① 如果函数调用成功,返回s参数指向的地址;② 如果在读取字符的过程中遇到EOF,则eof 指示器被设置;如果还没读入任何字符就遇到这种EOF,则s参数指向的位置保持原来的内容,函数返回NULL;③ 如果在读取的过程中发生错误,则error 指示器被设置,函数返回NULL,但s参数指向的内容可能被改变。

(2)fputs

  • fputs函数用于将一个字符串写入到指定的文件中,表示字符串结尾的'\n'不会被一并写入。
  • 参数:① s:字符型指针,指向用于存放待写入字符串的位置;② stream:该参数是一个FILE对象的指针,指定一个待操作的数据流。
  • 返回值:① 如果函数调用成功,返回一个非0值;② 如果函数调用失败,返回EOF。

3.格式化读写文件(fscanf和fprintf)

  • fscanf函数 用于从指定文件中读取格式化字符串。
  • fprintf 函数用于打印格式化字符串到指定的文件。

4.二进制读写文件(fread和fwrite)

(1)fread

  • fread函数用于从指定的文件中读取指定尺寸的数据。
  • 参数:① ptr:指向存放数据的内存块指针,该内存块的尺寸最小应该是size*nmemb个字节;② size:指定要读取的每个元素的尺寸,最终尺寸等于size*nmemb;③ nmemb:指定要读取的元素个数,最终尺寸等于size*nmemb;④ stream:该参数是一个FILE对象的指针,指定一个待读取的文件流。
  • 返回值:① 返回值是实际读取到的元素个数(nmemb);② 如果返回值比nmemb参数的值小,表示可能读取到文件末尾或者有错误发生(可以使用 feof 函数或ferror 函数进一步判断)。

(2)fwrite

  • fwrite函数用于将指定尺寸的数据写入到指定的文件中。
  • 参数:① ptr:指向存放数据的内存块指针,该内存块的尺寸最小应该是size*nmemb个字节;② size:指定要写入的每个元素的尺寸,最终尺寸等于size*nmemb;③ nmemb:指定要写入的元素个数,最终尺寸等于size*nmemb;④ stream:该参数是一个FILE对象的指针,指定一个待写入的文件流。
  • 返回值:① 返回值是实际写入到的元素个数(nmemb);② 如果返回值与nmemb参数的值不同,则有错误发生。

三、随机读写文件(fseek)

  • fseek函数用于设置文件流的位置指示器。
  • 参数如下表:

  • 返回值:① 如果该函数调用成功,返回值是0;② 如果该函数调用失败,返回一个非0值。

四、可移植性问题

  • 对于以二进制模式打开的文件,fseek函数在某些操作系统可能不支持SEEK_END位置。

  • 对于以文本模式打开的文件,fseek函数的whence参数只能取SEEK_SET才是有意义的,并且传递给offset参数的值要么是0,要么是上一次对同个文件调用ftell函数获得的返回值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值