写点什么

C 语言编程语法—文件读写

作者:向阳逐梦
  • 2023-06-06
    四川
  • 本文字数:2106 字

    阅读完需:约 7 分钟

C语言编程语法—文件读写

一个文件,无论它是文本文件还是二进制文件,都是代表了一系列的字节。C 语言不仅提供了访问顶层的函数,也提供了底层(OS)调用来处理存储设备上的文件。本章将讲解文件管理的重要调用。

打开文件

您可以使用 fopen( ) 函数来创建一个新的文件或者打开一个已有的文件,这个调用会初始化类型 FILE 的一个对象,类型 FILE 包含了所有用来控制流的必要的信息。下面是这个函数调用的原型:

FILE *fopen( const char *filename, const char *mode );
复制代码

在这里,filename 是字符串,用来命名文件,访问模式 mode 的值可以是下列值中的一个:

如果处理的是二进制文件,则需使用下面的访问模式来取代上面的访问模式:

"rb", "wb", "ab", "rb+", "r+b", "wb+", "w+b", "ab+", "a+b"
复制代码

关闭文件

为了关闭文件,请使用 fclose( ) 函数。函数的原型如下:

 int fclose( FILE *fp );
复制代码

如果成功关闭文件,fclose( ) 函数返回零,如果关闭文件时发生错误,函数返回 EOF。这个函数实际上,会清空缓冲区中的数据,关闭文件,并释放用于该文件的所有内存。EOF 是一个定义在头文件 stdio.h 中的常量。

C 标准库提供了各种函数来按字符或者以固定长度字符串的形式读写文件。

写入文件

下面是把字符写入到流中的最简单的函数:

int fputc( int c, FILE *fp );
复制代码

函数 fputc() 把参数 c 的字符值写入到 fp 所指向的输出流中。如果写入成功,它会返回写入的字符,如果发生错误,则会返回 EOF。您可以使用下面的函数来把一个以 null 结尾的字符串写入到流中:

int fputs( const char *s, FILE *fp );
复制代码

函数 fputs() 把字符串 s 写入到 fp 所指向的输出流中。如果写入成功,它会返回一个非负值,如果发生错误,则会返回 EOF。您也可以使用 int fprintf(FILE *fp,const char *format, ...) 函数把一个字符串写入到文件中。尝试下面的实例:

    注意:请确保您有可用的 tmp 目录,如果不存在该目录,则需要在您的计算机上先创建该目录。
/tmp 一般是 Linux 系统上的临时目录,如果你在 Windows 系统上运行,则需要修改为本地环境中已存在的目录,例如: C:\tmp、D:\tmp等。
复制代码


#include <stdio.h> int main(){   FILE *fp = NULL;    fp = fopen("/tmp/test.txt", "w+");   fprintf(fp, "This is testing for fprintf...\n");   fputs("This is testing for fputs...\n", fp);   fclose(fp);}
复制代码

当上面的代码被编译和执行时,它会在 /tmp 目录中创建一个新的文件 test.txt,并使用两个不同的函数写入两行。接下来让我们来读取这个文件。

读取文件

下面是从文件读取单个字符的最简单的函数:

int fgetc( FILE * fp );
复制代码

fgetc() 函数从 fp 所指向的输入文件中读取一个字符。返回值是读取的字符,如果发生错误则返回 EOF。下面的函数允许您从流中读取一个字符串:

char *fgets( char *buf, int n, FILE *fp );
复制代码

函数 fgets() 从 fp 所指向的输入流中读取 n - 1 个字符。它会把读取的字符串复制到缓冲区 buf,并在最后追加一个 null 字符来终止字符串。

如果这个函数在读取最后一个字符之前就遇到一个换行符 '\n' 或文件的末尾 EOF,则只会返回读取到的字符,包括换行符。您也可以使用 int fscanf(FILE *fp, const char *format, ...) 函数来从文件中读取字符串,但是在遇到第一个空格和换行符时,它会停止读取。

#include <stdio.h> int main(){   FILE *fp = NULL;   char buff[255];    fp = fopen("/tmp/test.txt", "r");   fscanf(fp, "%s", buff);   printf("1: %s\n", buff );    fgets(buff, 255, (FILE*)fp);   printf("2: %s\n", buff );      fgets(buff, 255, (FILE*)fp);   printf("3: %s\n", buff );   fclose(fp); }
复制代码

当上面的代码被编译和执行时,它会读取上一部分创建的文件,产生下列结果:

1: This2: is testing for fprintf...
3: This is testing for fputs...
复制代码

首先,fscanf() 方法只读取了 This,因为它在后边遇到了一个空格。其次,调用 fgets() 读取剩余的部分,直到行尾。最后,调用 fgets() 完整地读取第二行。

二进制 I/O 函数

下面两个函数用于二进制输入和输出:


size_t fread(void *ptr, size_t size_of_elements, size_t number_of_elements, FILE *a_file); size_t fwrite(const void *ptr, size_t size_of_elements, size_t number_of_elements, FILE *a_file);
复制代码

这两个函数都是用于存储块的读写 - 通常是数组或结构体。


对 fopen()函数补充说明几点:

FILE *fopen( const char * filename, const char * mode );
复制代码
  • 该函数可能执行失败,返回值是 NULL,安全起见必须对返回值进行合法性判断;

  • 该函数有多种模式,其中 r+和 w+看似一样,都是读写其实还是有几点区别的;

  •       1.模式 r+找不到文件不会自动新建,而 w+会;

  •       2.模式 r+打开文件后,不会清除文件原数据,若直接开始写入,只会从起始位置开始进行覆盖,而 w+会直接清零后,再开始读写;

  • 模式的合法性说明:不能用大写,只能是小写,且 rb+和 r+b 都是合法的,但 br+和+rb 等都是非法的,w 和 a 也是一样的处理;

  • 模式 w 的自动新建文件是有条件的,只有对应的路径存在(即文件所在的文件夹存在),文件不存在才会新建,否则是不会新建的,返回 NULL。

发布于: 刚刚阅读数: 7
用户头像

向阳逐梦

关注

人生享受编程,编程造就人生! 2022-06-01 加入

某公司芯片测试工程师,嵌入式开发工程师,InfoQ签约作者,阿里云星级博主,华为云·云享专家。座右铭:向着太阳,追逐梦想!

评论

发布
暂无评论
C语言编程语法—文件读写_C语言_向阳逐梦_InfoQ写作社区