首页 > 编程语言 >C/C++ 操作文件常用的函数

C/C++ 操作文件常用的函数

时间:2024-06-19 12:00:02浏览次数:14  
标签:文件 常用 const 函数 stream C++ char FILE 打开

C语言中操作文件常用的函数包括但不限于以下几种:

  1. 打开和关闭文件
    • fopen(const char *path, const char *mode):用于打开一个文件,返回一个指向FILE结构体的指针,path是文件路径,mode定义了文件的打开模式(如读、写、追加等)。
    • fclose(FILE *stream):关闭由fopen()打开的文件,并刷新缓冲区中的数据到磁盘。
  2. 读取和写入数据
    • 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):将内存中的数据写入文件,参数含义同上。
  3. 文件定位
    • fseek(FILE *stream, long offset, int origin):移动文件内部的位置指针,offset是偏移量,origin定义了偏移的起点(如SEEK_SET、SEEK_CUR、SEEK_END)。
    • ftell(FILE *stream):获取文件当前的位置指针相对于文件开始的位置,返回当前位置的偏移量。
    • rewind(FILE *stream):将文件位置指针重新定位到文件的开头。
  4. 其他常用函数
    • 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

相关文章

  • Java调用mysql后台函数的例子
    在Java中调用MySQL后台的存储函数(注意,这里我们区分存储过程和存储函数:存储过程没有返回值,但可以通过输出参数返回数据;而存储函数有一个返回值)时,你需要使用CallableStatement来执行这个函数并获取返回值。以下是一个简单的例子,说明如何在Java中调用MySQL的存储函数:MySQL存储函......
  • 请编写函数fun,对长度位7个字符的字符串,除首尾字符外,将其余5个字符按ASCII码降序排列
    请编写函数fun,对长度位7个字符的字符串,除首尾字符外,将其余5个字符按ASCII码降序排列#include<stdio.h>#include<string.h>voidsortDescending(charstr[]){intlen=strlen(str);if(len!=7) {printf("字符串长度不为7,无法进行排序。\n");......
  • 编写函数int fun(int lim,int aa[MAX]),该函数的功能是求出小于或等于lim的所有素数并
    编写函数intfun(intlim,intaa[MAX]),该函数的功能是求出小于或等于lim的所有素数并放在aa数组中,该函数返回所求的素数的个数。#include<stdio.h>#defineMAX100intisPrime(intnum){if(num<2){return0;}for(inti=2;i*i<=num;......
  • C++数据格式化3 - 格式化时间区间(使用时长)
    1.关键词2.strfmt.h3.strfmt.cpp4.测试代码5.运行结果6.源码地址1.关键词关键字:C++数据格式化字符串处理std::string时间区间跨平台应用场景:想对一个时间区间(如用时:2000s)进行格式化,转化成人类易读的时分秒的格式。2.strfmt.h#pragmaonce#include......
  • C++数据格式化4 - 格式化时间戳
    1.关键词2.strfmt.h3.strfmt.cpp4.测试代码5.运行结果6.源码地址1.关键词C++数据格式化字符串处理std::string时间戳跨平台2.strfmt.h#pragmaonce#include<string>#include<cstdint>#include<sstream>#include<iomanip>#include"timeutil.h&quo......
  • C++
    求一个三位数题目描述求这样一个三位数,该三位数等于其每位数字的阶乘之和。即abc=a!+b!+c!(n!表示n的阶乘)输入无输出输出这个数亲密数对题目描述键盘输入N,N在2至2000之间,求2至N中的亲密数对,就是A的因子和等于B,B的因子和等于A,且A≠B。如48......
  • C++数据格式化2 - 将文件大小转换为人类易读的格式
    1.关键词2.strfmt.h3.strfmt.cpp4.测试代码5.运行结果6.源码地址1.关键词C++数据格式化字符串处理std::string文件大小跨平台2.strfmt.h#pragmaonce#include<string>#include<cstdint>#include<sstream>#include<iomanip>namespacecutl{......
  • Vitis HLS 学习笔记--函数例化(Function Instantiation)
    目录1.简介2.功能分析3.示例分析3.1不使用 FUNCTION_INSTANTIATE3.2使用 FUNCTION_INSTANTIATE4.总结1.简介函数例化(FunctionInstantiation)是VitisHLS中的一个高级优化技术。它允许开发者在保持函数层次结构的同时,对函数的特定实例进行局部优化。如果函......
  • C++数据格式化1 - uint转换成字符串 & double转换成字符串
    1.关键词2.strfmt.h3.strfmt.cpp4.测试代码5.运行结果6.源码地址1.关键词C++数据格式化字符串处理std::stringintdouble跨平台2.strfmt.h#pragmaonce#include<string>#include<cstdint>#include<sstream>#include<iomanip>namespacecutl{......
  • NumPy 双曲函数与集合操作详解
    NumPy双曲函数NumPy提供了sinh()、cosh()和tanh()等ufunc,它们接受弧度值并生成相应的双曲正弦、双曲余弦和双曲正切值。示例:importnumpyasnpx=np.sinh(np.pi/2)print(x)示例找到数组arr中所有值的双曲余弦值:importnumpyasnparr=np.array([n......