下面详细讲解 C 语言标准库中的一些文件操作函数,包括 fopen
、fclose
、fread
、fwrite
、fseek
、ftell
、fprintf
和 fscanf
,这些函数提供了基本的文件读写功能和文件位置操作功能。
1. fopen
- 功能:
fopen()
用于打开一个文件,并返回一个指向FILE
结构的指针。它可以指定打开的模式(如读、写、追加等)。 - 原型:
FILE *fopen(const char *filename, const char *mode);
- 参数:
filename
:文件名的字符串。mode
:打开文件的模式,如下:"r"
:只读模式。文件必须存在。"w"
:只写模式。文件不存在时会创建,存在时会清空。"a"
:追加模式。文件不存在时会创建,存在时在文件末尾写入数据。"r+"
:读写模式,文件必须存在。"w+"
:读写模式,文件不存在时创建,存在时清空。"a+"
:读写模式,文件不存在时创建,存在时从末尾开始写入。
- 返回值:返回文件指针,失败返回
NULL
。
示例:
FILE *fp = fopen("example.txt", "r");
if (fp == NULL) {
perror("文件打开失败");
}
2. fclose
- 功能:
fclose()
用于关闭一个已打开的文件,并释放与文件相关的系统资源。 - 原型:
int fclose(FILE *stream);
- 参数:
stream
:指向需要关闭的文件指针。
- 返回值:成功时返回 0,失败时返回 EOF。
示例:
fclose(fp);
3. fread
- 功能:
fread()
从文件中读取数据到内存缓冲区中,读取的内容按块读取。 - 原型:
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
- 参数:
ptr
:指向存储读取数据的缓冲区。size
:每个元素的大小(通常是sizeof(type)
)。nmemb
:要读取的元素数量。stream
:文件指针。
- 返回值:返回成功读取的元素数量。
示例:
char buffer[256];
size_t bytesRead = fread(buffer, sizeof(char), 255, fp);
buffer[bytesRead] = '\0'; // 确保字符串以空字符结尾
4. fwrite
- 功能:
fwrite()
将数据从内存缓冲区写入文件,以块的方式写入。 - 原型:
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
- 参数:
ptr
:指向要写入的数据缓冲区。size
:每个元素的大小。nmemb
:要写入的元素数量。stream
:文件指针。
- 返回值:返回成功写入的元素数量。
示例:
const char *text = "Hello, World!";
fwrite(text, sizeof(char), strlen(text), fp);
5. fseek
- 功能:
fseek()
用于移动文件指针到文件的指定位置,常用于随机访问文件。 - 原型:
int fseek(FILE *stream, long offset, int whence);
- 参数:
stream
:文件指针。offset
:相对于whence
的偏移量(以字节为单位)。whence
:决定偏移量相对于哪个位置:SEEK_SET
:文件开头。SEEK_CUR
:当前文件指针位置。SEEK_END
:文件末尾。
- 返回值:成功返回 0,失败返回非 0 值。
示例:
fseek(fp, 0, SEEK_END); // 将文件指针移动到文件末尾
6. ftell
- 功能:
ftell()
返回当前文件指针的位置(以字节为单位),即从文件开头到当前位置的偏移量。 - 原型:
long ftell(FILE *stream);
- 参数:
stream
:文件指针。
- 返回值:返回当前文件指针位置(从文件开始的偏移量),失败返回 -1。
示例:
long position = ftell(fp); // 获取当前文件指针位置
7. fprintf
- 功能:
fprintf()
用于将格式化的输出写入到文件中,类似于printf()
,只是输出目标是文件而非控制台。 - 原型:
int fprintf(FILE *stream, const char *format, ...);
- 参数:
stream
:文件指针。format
:格式化字符串,类似于printf()
的格式。...
:可变参数,用于格式化输出的内容。
- 返回值:返回写入的字符数,失败时返回负值。
示例:
fprintf(fp, "Name: %s, Age: %d\n", "Alice", 30);
8. fscanf
- 功能:
fscanf()
用于从文件中读取格式化输入,类似于scanf()
,但从文件读取而非标准输入。 - 原型:
int fscanf(FILE *stream, const char *format, ...);
- 参数:
stream
:文件指针。format
:格式化字符串,类似于scanf()
的格式。...
:指向变量的指针,用于存储读取到的内容。
- 返回值:返回成功读取的项数,遇到错误或到达文件末尾时返回
EOF
。
示例:
char name[50];
int age;
fscanf(fp, "%s %d", name, &age);
printf("Name: %s, Age: %d\n", name, age);
总结:
文件操作:
fopen()
:打开文件。fclose()
:关闭文件。fread()
:从文件中读取数据。fwrite()
:向文件中写入数据。
文件指针操作:
fseek()
:移动文件指针。ftell()
:获取当前文件指针位置。
格式化输入输出:
fprintf()
:向文件写入格式化数据。fscanf()
:从文件读取格式化数据。
这些函数一起使用,可以实现多种文件操作,如顺序读写、随机访问和格式化数据处理。