在C语言中,文件操作是程序开发中非常重要的一部分。无论是读取文件内容、写入数据,还是对文件进行随机访问,C标准库都提供了丰富的函数来支持这些操作。本文将详细介绍常用的文件操作函数,包括fread
、fwrite
、fseek
、ftell
和fclose
,并通过实例介绍这些函数的使用方法。
目录
1. fread 函数
fread
函数用于从文件中读取数据,通常用于二进制文件的读取操作。它的函数原型如下:
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
参数说明:
-
ptr:指向一个内存块的指针,用于存储从文件中读取的数据。
-
size:每个数据项的大小(以字节为单位)。
-
nmemb:要读取的数据项的数量。
-
stream:指向FILE对象的指针,指定一个输入流。
返回值:
-
返回成功读取的数据项数量。如果返回值小于
nmemb
,可能是因为遇到了文件末尾或发生了读取错误。
示例:读取二进制文件中的数据
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *file;
int *buffer;
size_t num_elements = 5;
size_t elements_read;
// 打开二进制文件
file = fopen("data.bin", "rb");
if (file == NULL) {
perror("无法打开文件");
return EXIT_FAILURE;
}
// 分配内存来存储读取的数据
buffer = (int *)malloc(num_elements * sizeof(int));
if (buffer == NULL) {
perror("内存分配失败");
fclose(file);
return EXIT_FAILURE;
}
// 使用fread读取数据
elements_read = fread(buffer, sizeof(int), num_elements, file);
if (elements_read < num_elements) {
if (feof(file)) {
printf("已到达文件末尾,读取的元素数量少于预期。\n");
} else if (ferror(file)) {
perror("读取文件时发生错误");
}
}
// 打印读取的数据
for (size_t i = 0; i < elements_read; i++) {
printf("%d ", buffer[i]);
}
printf("\n");
// 释放内存并关闭文件
free(buffer);
fclose(file);
return EXIT_SUCCESS;
}
2. fwrite 函数
fwrite
函数用于将数据写入文件,通常用于二进制文件的写入操作。它的函数原型如下:
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
参数说明:
-
ptr:指向要写入文件的数据的指针。
-
size:每个数据项的大小(以字节为单位)。
-
nmemb:要写入的数据项的数量。
-
stream:指向FILE对象的指针,指定一个输出流。
返回值:
-
返回成功写入的数据项数量。如果返回值小于
nmemb
,说明写入过程中发生了错误。
示例:将数据写入二进制文件
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *file;
int data[] = {10, 20, 30, 40, 50};
size_t num_elements = sizeof(data) / sizeof(data[0]);
// 打开二进制文件
file = fopen("output.bin", "wb");
if (file == NULL) {
perror("无法打开文件");
return EXIT_FAILURE;
}
// 使用fwrite写入数据
size_t elements_written = fwrite(data, sizeof(int), num_elements, file);
if (elements_written < num_elements) {
perror("写入文件时发生错误");
}
// 关闭文件
fclose(file);
printf("数据已成功写入文件。\n");
return EXIT_SUCCESS;
}
3. fseek 函数
fseek
函数用于设置文件指针的位置,以便在文件中进行随机访问。它的函数原型如下:
int fseek(FILE *stream, long offset, int whence);
参数说明:
-
stream:指向FILE对象的指针。
-
offset:偏移量(以字节为单位),表示从
whence
位置开始的偏移。 -
whence:起始位置,可以是以下值之一:
-
SEEK_SET
:文件开头。 -
SEEK_CUR
:当前文件指针位置。 -
SEEK_END
:文件末尾。
-
返回值:
-
如果成功,返回0;如果失败,返回非零值。
示例:随机访问文件
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *file;
int value;
// 打开二进制文件
file = fopen("output.bin", "rb");
if (file == NULL) {
perror("无法打开文件");
return EXIT_FAILURE;
}
// 将文件指针移动到第3个整数的位置
fseek(file, 2 * sizeof(int), SEEK_SET);
// 读取数据
fread(&value, sizeof(int), 1, file);
printf("第3个整数的值是:%d\n", value);
// 关闭文件
fclose(file);
return EXIT_SUCCESS;
}
4. ftell 函数
ftell
函数用于获取当前文件指针的位置(以字节为单位)。它的函数原型如下:
long ftell(FILE *stream);
参数说明:
-
stream:指向FILE对象的指针。
返回值:
-
返回当前文件指针的位置。如果发生错误,返回-1L。
示例:获取文件指针位置
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *file;
long position;
// 打开二进制文件
file = fopen("output.bin", "rb");
if (file == NULL) {
perror("无法打开文件");
return EXIT_FAILURE;
}
// 移动文件指针到文件末尾
fseek(file, 0, SEEK_END);
// 获取文件指针位置(文件大小)
position = ftell(file);
printf("文件大小:%ld 字节\n", position);
// 关闭文件
fclose(file);
return EXIT_SUCCESS;
}
5. fclose 函数
fclose
函数用于关闭一个打开的文件,释放与该文件关联的资源。它的函数原型如下:
int fclose(FILE *stream);
参数说明:
-
stream:指向FILE对象的指针。
返回值:
-
如果成功关闭文件,返回0;如果失败,返回EOF。
示例:关闭文件
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *file;
// 打开文件
file = fopen("output.bin", "rb");
if (file == NULL) {
perror("无法打开文件");
return EXIT_FAILURE;
}
// 操作文件...
// 关闭文件
if (fclose(file) == 0) {
printf("文件已成功关闭。\n");
} else {
perror("关闭文件时发生错误");
}
return EXIT_SUCCESS;
}
6. 综合示例:文件的读取、写入和随机访问
以下是一个综合示例,演示如何使用fwrite
、fread
、fseek
和ftell
函数对文件进行操作。
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *file;
int data[] = {10, 20, 30, 40, 50};
int buffer[5];
size_t num_elements = sizeof(data) / sizeof(data[0]);
// 写入数据到文件
file = fopen("data.bin", "wb");
if (file == NULL) {
perror("无法打开文件");
return EXIT_FAILURE;
}
fwrite(data, sizeof(int), num_elements, file);
fclose(file);
// 读取文件中的数据
file = fopen("data.bin", "rb");
if (file == NULL) {
perror("无法打开文件");
return EXIT_FAILURE;
}
fread(buffer, sizeof(int), num_elements, file);
for (size_t i = 0; i < num_elements; i++) {
printf("%d ", buffer[i]);
}
printf("\n");
// 使用fseek和ftell获取文件大小
fseek(file, 0, SEEK_END);
long file_size = ftell(file);
printf("文件大小:%ld 字节\n", file_size);
// 关闭文件
fclose(file);
return EXIT_SUCCESS;
}
7. 总结
-
fread
:用于从文件中读取数据,适合二进制文件操作。 -
fwrite
:用于将数据写入文件,适合二进制文件操作。 -
fseek
:用于移动文件指针,支持随机访问。 -
ftell
:用于获取当前文件指针的位置。 -
fclose
:用于关闭文件,释放资源。