在C语言中,文件读写是一个非常重要的功能,它允许程序与外部数据进行交互。通过文件读写,我们可以将数据保存到硬盘上,也可以从硬盘上读取数据。下面,我们将详细讲解C语言中的文件读写操作,并附上相应的编程示例。
一、文件的基本概念
在C语言中,文件被视为一个字节序列,也就是说,文件是一个字节流或二进制流。根据数据的组织形式,文件可分为文本文件和二进制文件。文本文件以字符形式存储数据,每个字符占一个字节,通常用于存储文本信息。而二进制文件则以二进制形式存储数据,可以存储各种类型的数据,包括字符、整数、浮点数等。
二、文件的打开与关闭
在C语言中,进行文件读写操作前,需要先打开文件,操作完成后,再关闭文件。这可以通过fopen和fclose函数来实现。
1.fopen函数
fopen函数用于打开一个文件,其函数原型如下:
FILE *fopen(const char *filename, const char *mode);
其中,filename是文件名,mode是打开方式。mode参数指定了文件的打开模式,如"r"表示只读打开,"w"表示写入(会覆盖原有文件内容),"a"表示追加等。如果文件打开成功,fopen函数会返回一个FILE类型的指针,否则返回NULL。
2.fclose函数
fclose函数用于关闭一个已打开的文件,其函数原型如下:
int fclose(FILE *stream);
其中,stream是fopen函数返回的文件指针。如果文件关闭成功,fclose函数会返回0,否则返回EOF。
三、文件的读写操作
在C语言中,有多种方式可以进行文件的读写操作,如fputc、fgetc、fputs、fgets、fread、fwrite等函数。下面,我们将介绍其中几个常用的函数。
1.fputc和fgetc函数
fputc函数用于将一个字符写入文件,其函数原型如下:
int fputc(int char, FILE *stream);
其中,char是要写入的字符,stream是文件指针。如果写入成功,fputc函数会返回写入的字符,否则返回EOF。
fgetc函数用于从文件中读取一个字符,其函数原型如下:
int fgetc(FILE *stream);
其中,stream是文件指针。如果读取成功,fgetc函数会返回读取的字符,否则返回EOF。
2.fputs和fgets函数
fputs函数用于将一个字符串写入文件,其函数原型如下:
int fputs(const char *str, FILE *stream);
其中,str是要写入的字符串,stream是文件指针。如果写入成功,fputs函数会返回一个非负值,否则返回EOF。
fgets函数用于从文件中读取一行字符串,其函数原型如下:
char *fgets(char *str, int n, FILE *stream);
其中,str是存储读取字符串的缓冲区,n是缓冲区的长度,stream是文件指针。如果读取成功,fgets函数会返回缓冲区的指针,否则返回NULL。
四、编程示例
下面是一个简单的C程序,演示了如何使用上述函数进行文件的读写操作:
#include <stdio.h> #include <stdlib.h> int main() { FILE *fp; char ch; char str[100]; // 打开文件,如果文件不存在则创建 fp = fopen("test.txt", "w+"); if (fp == NULL) { printf("文件打开失败!\n"); exit(1); } // 写入数据到文件 fputc('H', fp); fputc('e', fp); fputc('l', fp); fputc('l', fp); fputc('o', fp); fputc('\n', fp); fputs("Welcome to C file I/O tutorial!\n", fp); // 重新定位文件指针到文件开头 rewind(fp); // 从文件中读取数据并打印出来 while ((ch = fgetc(fp)) != EOF) { putchar(ch); } printf("\n"); // 再次重新定位文件指针到文件开头,并读取一行数据到str中 rewind(fp); fgets(str, 100, fp); printf("读取的一行数据是:%s", str); // 关闭文件并退出程序 fclose(fp); return 0; }
这个程序首先创建了一个名为"test.txt"的文件,并向其中写入了两行数据。然后,它重新定位文件指针到文件开头,并逐字符读取文件中的数据并打印出来。最后,它再次重新定位文件指针到文件开头,并读取一行数据到str中,然后打印出来。