Chaos C语言文件操作函数

一、文件操作

1.1文件打开和关闭

1. 打开文件

函数原型:
FILE *fopen ( const char * restrict filename , const char * restrict mode) ;
注:restrict为C99特性

说明:
  fopen函数第一个参数是含有要打开文件名的字符串(“文件名”可能包含文件位置信息,如驱动器符或路径);第二个参数是“模式字符串”。
  当无法打开文件时,fopen函数会返回空指针。(每次都要测试fopen函数的返回值以确保不是空指针)

      用于文本文件/二进制文件的模式字符串

字符串(文本文件/二进制文件)含义
" r " / " rb "打开文件用于读
" w " / " wb "打开文件用于写(文件不需要存在)
" a " / " ab "打开文件用于追加(文件不需要存在)
" r+ " / " r+b " 或 " rb+ "打开文件用于读和写,从文件头开始
" w+ " / " w+b " 或 " wb+ "打开文件用于读和写(如果文件存在就截去)
" a+ " / " a+b " 或 " ab+ "打开文件用于读和写(如果文件存在就追加)

2. 关闭文件

函数原型:
int fclose(FILE *stream) ;

说明:
  fclose函数允许程序关闭不再使用的文件,其参数必须是文件指针,此指针来自fopen函数或freopen函数的调用。
  如果成功关闭了文件,fclose函数会返回零;否则,返回错误代码EOF。

3. 关联输入输出

函数原型:
FILE *freopen ( const char * restrict filename,
       const char * restrict mode,
       FILE * restrict stream ) ;

说明:
  freopen函数为已打开的流关联一个不同文件。
  freopen函数在关闭了先前与stdout相关联的所有文件后,打开新文件,将其与第三个参数(已打开的流)关联。
  freopen函数的返回值通常是它的第三个参数(一个文件指针),如果无法打开新文件,它会返回空指针。(如果无法关闭旧文件,它会忽略掉错误)。

eg:

#include<stdio.h>

int main ()
{	char s[10];
	freopen("in.txt","r",stdin); //stdin重新定向(关联)到"in.txt"
	freopen("out.txt","w",stdout); //stdout重定向(关联)到"out.txt"
	scanf("%s",s);	//从"in.txt"读入字符串
	printf("%s\n",s); //输出字符串到"out.txt"
	fclose(stdout);
	fclose(stdin);
	freopen("CON","r",stdin); //回到控制台
	freopen("CON","w",stdout);
}

1.2临时文件

1. tmpfile函数

函数原型:FILE *tempfile ( void );

说明:
  tempfile函数创建一个临时文件(用“wb+"模式打开),该临时文件将一直存在,除非关闭它或终止程序。
  该函数调用会返回文件指针,此指针可用于后续访问该文件。

2. tmpnam函数

函数原型:char *tmpnam ( char *s ) ;

说明:
  tmpnam函数为临时文件产生名字。
  如果它的实际参数是空指针,tmonam函数会把文件名存储到一个静态变量中,返回指向此变量的指针;否则,tmpnam函数会把文件名复制到程序员提供的字符数组中( 也会返回指向数组第一个字符的指针)。
  如果生成文件名失败,tmpnam函数会返回空指针(临时文件名在程序执行期间存在最大数量TMP_MAX(<stdio.h>中的宏))。

eg:

char *filename;
-------
filename = tmpnam(NULL);
char filename [L_tmpnam]; //L_tmpname是<stdio.h>中一个宏
--------
tmpnam(filename);

1.3文件删除与重命名

文件删除函数原型:int remove (const char *filename) ;

eg:remove("filename") ;

文件重命名函数原型:int rename (const char *old , const char *new) ;

eg:rename("filename1","filename2") ;

说明:
  remove函数和rename函数对文件名进行处理。
  若调用成功,两个函数都返回零;否则,都返回非零值。
  注:对文件进行删除和改名操作时,一定要确保文件关闭。

二、格式化的输入/输出

2.1 …printf函数

函数原型:
int fprintf (FILE * restrict stream ,const char * restrict format, …) ;
int printf (const char * restrict format, …) ;

说明:
  fprintf函数和printf函数唯一的不同就是后者始终向 stdout 写入内容,而前者可以向它自己的第一个实际参数指定的流中写入内容。fprintf函数常见应用之一:向标准错误流stderr写入出错信息。
  两个函数的返回值是写入的字符数,若出错则返回一个负值。

2.2 …scanf函数

函数原型:
int fscanf (FILE * restrict stream, const char * restrict format, …) ;
int scanf (const char * restrict format, …) ;

说明:
  scanf函数始终从标准输入流 stdin 中读入内容,而fscanf函数从它的第一个参数所指定的流中读入内容。

注:发生输入失败或匹配失败,…fscanf函数会提前返回。

三、字符的输入/输出

3.1字符输出

函数原型:
int fputc (int c, FILE *stream) ;
int putc (int c, FILE *stream) ;
int putchar (int c) ;

说明:
  putchar函数向 stdout 写一个字符;fputc函数和putc函数可向任意流写字符。
  putc函数可作为宏实现,而fputc函数只作为函数实现;putc宏对stream参数可多次求值,fputc不可;putc速度较快。

eg:#define putchar(c) putc((c),stdout);

  若出现写错误,三个函数会为流设置错误指示器并返回EOF;否则,返回写入的字符。

3.2字符输入

函数原型:
int fgetc (FILE *stream) ;
int getc (FILE *stream) ;
int getchar (void) ;
int ungetc (int c, FILE *stream) ;

说明:
  getchar函数从stdin中读入一个字符,fgetc函数和getc函数从任意流中读入一个字符。
  fgetc与getc的关系类似于fputc和putc。
  如果遇到文件末尾,三个函数都会设置流的文件末尾指示器,并返回EOF;如果产生读错误,它们则会设置流的错误指示器,并返回EOF。

惯用法:从文件中逐个读入字符直到遇到文件末尾

while((ch = get(fp)) != EOF{
  ...
} //三个函数的返回值应存储在int类型变量中

ungetc函数:
  此函数把从流中读入的字符“放回”并清除流的文件末尾指示器。

四、行的输入/输出

4.1行输出

函数原型:
int fputs (const char * restrict s, FILE * restrict stream) ;
int puts (const char *s);

说明:
  puts函数用来向 stdout 写入字符串;fputs函数可向指定的流写入字符串。fputs函数不会自己写入换行符。
  出现写错误时,两者都返回EOF;否则,都返回一个非负的数。

4.2行输入

函数原型:
char *fgets(char * restrict s, int n, FILE * restrict stream) ;
char *gets(char *s);

说明:
  gets函数用来从 stdin 中读取一行,它会逐个读取字符,并把它们存储在字符数组中,直到读到换行符时停止(丢弃换行符)。
  fgets函数可从任意流中读取信息,它会限制要储存的字符数量(第二个参数)。如果fgets函数读入了换行符,它会储存换行符。
  如果出现读错误,或在存储任何字符之前达到了输入流末尾,两个函数会返回空指针;否则,返回第一个实参。

fgets(str,sizeof(str),stdin);
gets(str);
//二者等价,但前者可防止读入字符数量越界,更安全。

五、块的输入/输出

函数原型:
size_t fread(void * restrict ptr,
      size_t size, size_t nmemb,
      FILE * restrict stream) ;
size_t fwrite(const void * restrict ptr,
      size_t size, size_t nmemb,
      FILE * restrict stream) ;

说明:
  两个函数允许程序在单步中读写大数据块,主要用于二进制的流。

fwrite函数:
  把内存中的数组复制给流(可以是数组任何区间的内容)。
  四个参数分别是:数组地址,每个数组元素的大小(字节),要写的元素数量,文件指针。
  该函数返回实际写入的元素的数量。如果出现写入错误,此数会小于第三个实参。

fread函数:
  从流读入数组的元素。
  参数与fwrite函数类似。
  返回值是实际读的元素的数量。此数应等于第三个参数,除非达到了输入文件末尾或出现错误。





参考资料:《c语言程序设计 现代方法(第2版)》第22章 输入/输出
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值