C语言中操作文件常用的函数包括但不限于以下几种:
- 打开和关闭文件
fopen(const char *path, const char *mode)
:用于打开一个文件,返回一个指向FILE
结构体的指针,path
是文件路径,mode
定义了文件的打开模式(如读、写、追加等)。fclose(FILE *stream)
:关闭由fopen()
打开的文件,并刷新缓冲区中的数据到磁盘。
- 读取和写入数据
fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
:从文件读取数据到内存,ptr
是目标缓冲区的地址,size
是每个元素的大小,nmemb
是要读取的元素数量,stream
是文件指针。fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
:将内存中的数据写入文件,参数含义同上。
- 文件定位
fseek(FILE *stream, long offset, int origin)
:移动文件内部的位置指针,offset
是偏移量,origin
定义了偏移的起点(如SEEK_SET、SEEK_CUR、SEEK_END)。ftell(FILE *stream)
:获取文件当前的位置指针相对于文件开始的位置,返回当前位置的偏移量。rewind(FILE *stream)
:将文件位置指针重新定位到文件的开头。
- 其他常用函数
feof(FILE *stream)
:检测是否已到达文件末尾,如果是则返回非零值。ferror(FILE *stream)
:检查与流相关的错误状态,如果有错误则返回非零值。clearerr(FILE *stream)
:清除由ferror()
或feof()
设置的错误指示和文件结束指示。getc(FILE *stream)
和putc(int character, FILE *stream)
:分别为从文件读取单个字符和向文件写入单个字符的函数。gets(char *s)
和puts(const char *s)
:虽然常用,但不推荐,因为gets
容易导致缓冲区溢出,推荐使用更安全的fgets
替代。fgets(char *s, int n, FILE *stream)
:从文件读取一行文本到字符串s
中,最多读取n-1
个字符。fprintf(FILE *stream, const char *format, ...)
:格式化输出到文件。fscanf(FILE *stream, const char *format, ...)
:从文件按格式读取数据。
这些函数都定义在<stdio.h>头文件中,是进行文件输入输出操作的基础。
C语言中fopen()
函数支持的文件打开模式(只读、只写、读写)
r
:只读打开一个文本文件。如果文件不存在,打开操作失败。w
:只写打开一个文本文件。如果文件存在,则会被截断为零长度;如果文件不存在,则会新建。a
:追加模式打开一个文本文件。写入的数据会被追加到文件末尾。如果文件不存在,则会新建。r+
:读写模式打开一个文本文件。文件必须存在。w+
:读写模式打开一个文本文件。如果文件存在,则会被截断为零长度;如果文件不存在,则会新建。a+
:读写模式打开一个文本文件。写入的数据会被追加到文件末尾。如果文件不存在,则会新建。
对于二进制文件,只需在上述模式前加上字母b
,变成以下模式:
rb
:只读打开一个二进制文件。wb
:只写打开一个二进制文件。如果文件存在,则会被截断为零长度;如果文件不存在,则会新建。ab
:追加模式打开一个二进制文件。写入的数据会被追加到文件末尾。如果文件不存在,则会新建。rb+
:读写模式打开一个二进制文件。文件必须存在。wb+
:读写模式打开一个二进制文件。如果文件存在,则会被截断为零长度;如果文件不存在,则会新建。ab+
:读写模式打开一个二进制文件。写入的数据会被追加到文件末尾。如果文件不存在,则会新建。
相关代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <error.h>
#define BUFFER_SIZE 4096
// C语言标准库中并没有直接提供MIN宏,需要自己定义
#define MIN(a, b) ((a > b) ? b : a)
void copyHalfOfFile(const char *srcFilePath, const char *dstFilePath)
{
// 打开源文件
FILE *src = fopen(srcFilePath, "rb");
if (!src)
{
perror("failed to open the srouce file\n");
return;
}
// 定位源文件获取文件大小
fseek(src, 0, SEEK_END);
long fileSize = ftell(src);
fseek(src, 0, SEEK_SET);
if ((fileSize) <= 0)
{
perror("invalid file size.\n");
fclose(src);
return;
}
// 计算要复制的字节数
long halfSize = fileSize / 2;
// 打开目标文件
FILE *dst = fopen(dstFilePath, "wb");
if (!dst)
{
perror("failed to open target file\n");
return;
}
// 开始复制文件
char buffer[BUFFER_SIZE];
while (halfSize > 0)
{
long bytesToCopy = MIN(BUFFER_SIZE, halfSize);
fread(buffer, 1, bytesToCopy, src);
fwrite(buffer, 1, bytesToCopy, dst);
fflush(dst);
halfSize -= bytesToCopy;
}
fputc('\n', dst); // 添加换行符到目标文件
// 关闭文件
fclose(src);
fclose(dst);
printf("copied half of the file successfully.\n");
}
int main()
{
const char *srcPath = "/path/to/srouce file";
const char *dstPath = "/path/to/destination file";
copyHalfOfFile(srcPath, dstPath);
return 0;
}
标签:文件,常用,const,函数,stream,C++,char,FILE,打开
From: https://blog.csdn.net/zzzlearning/article/details/139798821