C语言对文件的输入输出
在C语言中,对文件的输入输出操作是通过标准库函数来实现的。这些函数允许你打开文件、读取文件内容、写入数据到文件以及关闭文件。下面是一些基本的文件操作函数和它们的使用示例。
打开文件
使用 fopen 函数来打开一个文件。该函数需要两个参数:文件名和打开模式。
c复制代码
|
FILE *fopen(const char *filename, const char *mode); |
打开模式可以是以下之一或它们的组合:
· "r":以只读方式打开文件。
· "w":以写入方式打开文件,如果文件不存在则创建它。如果文件已存在,则清空其内容。
· "a":以追加方式打开文件,如果文件不存在则创建它。写入的数据将被添加到文件的末尾。
· "r+":以读写方式打开文件。
· "w+":以读写方式打开文件,如果文件不存在则创建它。
· "a+":以读写方式打开文件,如果文件不存在则创建它。写入的数据将被添加到文件的末尾。
示例:
c复制代码
|
FILE *file = fopen("example.txt", "w"); |
|
if (file == NULL) { |
|
perror("Error opening file"); |
|
return 1; |
|
} |
写入文件
使用 fprintf 函数或 fwrite 函数将数据写入文件。
c复制代码
|
int fprintf(FILE *stream, const char *format, ...); |
|
size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream); |
示例:
c复制代码
|
// 使用 fprintf 写入字符串 |
|
fprintf(file, "Hello, World!\n"); |
|
|
|
// 使用 fwrite 写入二进制数据 |
|
int number = 42; |
|
fwrite(&number, sizeof(int), 1, file); |
读取文件
使用 fscanf 函数或 fread 函数从文件中读取数据。
c复制代码
|
int fscanf(FILE *stream, const char *format, ...); |
|
size_t fread(void *ptr, size_t size, size_t count, FILE *stream); |
示例:
c复制代码
|
// 使用 fscanf 读取字符串 |
|
char buffer[100]; |
|
fscanf(file, "%99s", buffer); // %99s 防止缓冲区溢出 |
|
|
|
// 使用 fread 读取二进制数据 |
|
int number; |
|
fread(&number, sizeof(int), 1, file); |
关闭文件
使用 fclose 函数关闭文件。
c复制代码
|
int fclose(FILE *stream); |
示例:
c复制代码
|
fclose(file); |
错误处理
当进行文件操作时,应该始终检查函数调用的返回值以处理可能的错误。例如,如果 fopen 函数失败,它将返回 NULL,此时可以使用 perror 函数打印出错误信息。
示例程序
下面是一个简单的C语言程序,它创建一个文件,写入一些文本,然后读取并显示它:
c复制代码
|
#include <stdio.h> |
|
|
|
int main() { |
|
FILE *file = fopen("example.txt", "w+"); |
|
if (file == NULL) { |
|
perror("Error opening file"); |
|
return 1; |
|
} |
|
|
|
// 写入数据 |
|
fprintf(file, "This is a test.\n"); |
|
|
|
// 回到文件的开始位置以读取数据 |
|
rewind(file); |
|
|
|
// 读取数据 |
|
char buffer[100]; |
|
while (fgets(buffer, sizeof(buffer), file) != NULL) { |
|
printf("%s", buffer); |
|
} |
|
|
|
// 关闭文件 |
|
fclose(file); |
|
|
|
return 0; |
|
} |
请注意,当使用 fopen 以写入模式(w、w+ 或 a)打开文件时,如果文件已存在,它的内容将被截断为零长度。如果你想在文件的现有内容后追加数据,应该使用追加模式(a 或 a+)。如果你想读取和写入同一个文件,并且不希望丢失现有内容,你应该使用更新模式(r+)。