本文将讲述linux系统下c语言操作文件
学习文件操作时,C 语言提供了一系列标准库函数来进行文件的创建、打开、读取、写入和关闭等操作。这些函数主要包含在 <stdio.h>
头文件中。以下是一些常用的文件操作接口:
-
fopen()
: 用于打开文件,并返回一个文件指针,可以用于后续的文件操作。语法为:FILE *fopen(const char *filename, const char *mode);
其中,filename
是要打开的文件名,mode
是打开文件的模式,比如只读、只写、追加等。 -
fclose()
: 用于关闭文件。语法为:int fclose(FILE *stream);
其中,stream
是要关闭的文件指针。 -
fread()
和fwrite()
: 用于读取和写入二进制数据。fread()
的语法为:size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
其中,ptr
是数据读取的缓冲区,size
是每个数据项的大小,nmemb
是数据项的数量,stream
是文件指针。fwrite()
的语法类似,用于写入数据。 -
fgets()
和fputs()
: 用于读取和写入文本数据(一行)。fgets()
的语法为:char *fgets(char *str, int n, FILE *stream);
其中,str
是接收读取数据的缓冲区,n
是缓冲区大小,stream
是文件指针。fputs()
的语法类似,用于写入数据。 -
fgetc()
和fputc()
: 用于逐个字符地读取和写入文件。fgetc()
的语法为:int fgetc(FILE *stream);
其中,stream
是文件指针。fputc()
的语法类似,用于写入字符。 -
fprintf()
和fscanf()
: 用于格式化输入输出。fprintf()
的语法为:int fprintf(FILE *stream, const char *format, ...);
其中,stream
是文件指针,format
是格式化字符串,...
是可变数量的参数。fscanf()
的语法类似,用于从文件中按照指定格式读取数据。 -
feof()
和ferror()
: 用于检查文件的结束和错误状态。feof()
的语法为:int feof(FILE *stream);
其中,stream
是文件指针。ferror()
的语法类似,用于检查文件的错误状态。
首先从创建文件开始
#include <stdio.h>
int main() {
FILE *fp;
// 创建一个新的文本文件,以只写模式打开
fp = fopen("new_file.txt", "w");
// 检查文件是否成功打开
if (fp == NULL) {
printf("无法创建文件.\n");
return 1;
}
// 关闭文件
fclose(fp);
printf("文件创建成功.\n");
return 0;
}
了常见的只读、只写和读写模式之外,fopen()
函数还提供了一些其他的打开模式,可以根据需要选择。下面是一些常见的额外打开模式:
-
二进制模式:
"rb"
: 二进制只读模式,以二进制模式打开一个已经存在的文件,文件必须存在,否则打开失败。"wb"
: 二进制只写模式,以二进制模式创建一个新的文件,如果文件已经存在,则清空文件内容,如果文件不存在,则创建新文件。"ab"
: 二进制追加模式,以二进制模式打开一个文件进行追加,如果文件不存在,则创建新文件,如果文件已存在,则在文件末尾追加内容。"rb+"
: 二进制读写模式,以二进制模式打开一个文件进行读写,文件必须存在,否则打开失败。"wb+"
: 二进制读写模式,以二进制模式创建一个新的文件进行读写,如果文件已经存在,则清空文件内容,如果文件不存在,则创建新文件。"ab+"
: 二进制读写模式,以二进制模式打开一个文件进行读写,如果文件不存在,则创建新文件,如果文件已存在,则在文件末尾追加内容。
-
文本和二进制模式的混合:
- 在上述模式后加上
"t"
或"b"
来指定是文本模式还是二进制模式。例如:"rt"
,"wt"
,"at"
,"rbt"
,"wbt"
,"abt"
。
- 在上述模式后加上
可以看到文件创建成功
之后来操作文件描述符写入文件
可以看到,插入代码
char str[] = "This is test string";
// 将字符串写入文件
fputs(str, fp);
运行即可。
下面是在一个 .c
文件中调用文件操作的各种接口的示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
FILE *fp;
char str[] = "这是一个写入文件的字符串。";
char buffer[100];
int ch;
// 创建一个新的文本文件,以只写模式打开
fp = fopen("output.txt", "w");
// 检查文件是否成功打开
if (fp == NULL) {
printf("无法创建文件.\n");
return 1;
}
// 将字符串写入文件
fputs(str, fp);
// 关闭文件
fclose(fp);
printf("字符串已成功写入文件.\n");
// 重新以只读模式打开文件
fp = fopen("output.txt", "r");
// 检查文件是否成功打开
if (fp == NULL) {
printf("无法打开文件.\n");
return 1;
}
// 读取文件内容并输出到控制台
printf("文件内容:\n");
while ((ch = fgetc(fp)) != EOF) {
putchar(ch);
}
// 关闭文件
fclose(fp);
printf("\n文件读取完毕.\n");
// 以追加模式打开文件
fp = fopen("output.txt", "a");
// 检查文件是否成功打开
if (fp == NULL) {
printf("无法打开文件.\n");
return 1;
}
// 写入一行新的内容到文件
fputs("\n这是追加的内容。", fp);
// 关闭文件
fclose(fp);
printf("追加内容成功写入文件.\n");
// 以只读模式打开文件
fp = fopen("output.txt", "r");
// 检查文件是否成功打开
if (fp == NULL) {
printf("无法打开文件.\n");
return 1;
}
// 使用 fgets 逐行读取文件内容并输出到控制台
printf("文件内容(逐行):\n");
while (fgets(buffer, sizeof(buffer), fp)) {
printf("%s", buffer);
}
// 关闭文件
fclose(fp);
printf("文件逐行读取完毕.\n");
// 以二进制只读模式打开文件
fp = fopen("output.txt", "rb");
// 检查文件是否成功打开
if (fp == NULL) {
printf("无法打开文件.\n");
return 1;
}
// 读取文件内容并输出到控制台
printf("二进制文件内容:\n");
while ((ch = fgetc(fp)) != EOF) {
putchar(ch);
}
// 关闭文件
fclose(fp);
printf("\n二进制文件读取完毕.\n");
// 以只读模式打开文件
fp = fopen("output.txt", "r");
// 检查文件是否成功打开
if (fp == NULL) {
printf("无法打开文件.\n");
return 1;
}
// 使用 fscanf 从文件中按照指定格式读取数据
printf("从文件中读取数据:\n");
while (fscanf(fp, "%s", buffer) != EOF) {
printf("%s ", buffer);
}
// 关闭文件
fclose(fp);
printf("\n从文件中读取数据完毕.\n");
// // 删除文件
// if (remove("output.txt") == 0) {
// printf("文件删除成功.\n");
// } else {
// printf("无法删除文件.\n");
// }
return 0;
}
这个示例中,我们演示了以下操作:
- 创建一个新的文本文件并写入字符串。
- 以只读模式打开文件并逐个字符读取文件内容输出到控制台。
- 以追加模式打开文件并在文件末尾追加一行新的内容。
- 重新以只读模式打开文件,并使用
fgets
函数逐行读取文件内容输出到控制台。 - 以二进制只读模式打开文件并逐个字符读取文件内容输出到控制台。
- 重新以只读模式打开文件,并使用
fscanf
函数按照指定格式读取文件内容输出到控制台。 - 最后,删除文件(已注释)。