c/c++ 文件操作相关的常用函数

文件操作相关的常用函数

标签:c/c++

  • 删除文件
    DeleteFile

    BOOL DeleteFile(
        LPCTSTR lpFileName // 文件名指针
    );
    • 功能说明
      删除一个存在的文件

    • 返回值

      1. 如果成功返回一个非0值
      2. 失败返回0,可以用GetLastError函数得到错误信息
          如果程序尝试删除一个不存在的文件。GetLastError返回ERROR_FILE_NOT_FOUND。如果文件是只读 的,则GetLastError返回ERROR_ACCESS_DENIED
  • 读写文件
    fread and fwrite

    
    #include <stdio.h>
    
    size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
    size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
    • 返回值
        读或写的记录数,成功时返回的记录数等于nmemb,出错或读到文件末尾时返回的记录数小于nmemb,也可能返回0。

    • 参数
        fread和fwrite用于读写记录,这里的记录的单位是字节(一串固定长度的字节),比如一个int、一个结构体或者一个定长数组,size对应的就是这些数据结构的长度(多少字节的长度),只是取1的情况更多一些。而nmemb指出要读或写多少条记录,这些记录会在ptr所指的内存空间中连续存放,共占size * nmemb个字节。

    • 功能
        fread从文件stream中读出size * nmemb个字节保存到ptr中;而fwrite把ptr中的size *nmemb个字节写到文件stream中。

    【需要注意】fwrite和fread函数中的 FILE *stream 参数,在一次操作的过程中,是具有连续性的,即下一次读取或者写入的操作是在上一次操作的基础上进行的。

    • 举例

      1. 将一个字符串写入文件
      char *str = "hello,I am a test program!";
      fwrite(str, sizeof(char), strlen(str), fp)
      1. 将一个字符数组写入文件
      char str[] = {'a','b','c','d','e'};
      fwrite(str, sizeof(char), sizeof(str), fp)
      1. 将一个整型数组写入文件
      int a[] = {12,33,23,24,12};
      fwrite(a, sizeof(int), nmemb, fp)

      对于先计算数组元素个数nmemb,之后再进行后续的操作,注意 sizeof(int)

    • fread_s 函数

      size_t fread_s( 
         void *buffer,
         size_t bufferSize,
         size_t elementSize,
         size_t count,
         FILE *stream 
      );  

      该函数只是运用在vs下的相对fread函数来说更安全的函数。

      • 参数
        buffer:存储数据的缓冲区
        bufferSize:存储数据的缓冲区的大小
        elementSize:读取对象的字节大小(一般取1,其他的情况可能是sizeof(int)或sizeof(structName)等等)
        count:要读取的对象的最大数量
        stream:文件句柄
  • 在文件中定位指针位置
    fseek and lseek

    • fseek

      int fseek(FILE *stream, long offset, int fromwhere);
      • 第一个参数stream为文件指针
      • 第二个参数offset为偏移量,正数表示正向偏移,负数表示负向偏移
      • 第三个参数origin设定从文件的哪里开始偏移,可能取值为:SEEK_CUR、 SEEK_END 或 SEEK_SET
        SEEK_SET: 文件开头
        SEEK_CUR: 当前位置
        SEEK_END: 文件结尾
        其中SEEK_SET,SEEK_CUR和SEEK_END依次为0,1和2。
        举例如下:
        fseek(fp,100L,0); 把文件内部指针(即fd)移动到离文件开头100字节处;
        fseek(fp,100L,1); 把文件内部指针(即fd)移动到离文件当前位置100字节处;
        fseek(fp,-100L,2); 把文件内部指针(即fd)退回到离文件结尾100字节处。
    • lseek
        相对于fseek基本是一样的,只是返回值不同,lseek返回的是一个off_t的数值,即文件内部指针相对于文件开头的偏移量。

  • 得到文件位置指针当前位置相对于文件首的偏移字节数
    ftell

    long ftell(FILE *stream);

    【注意】因为ftell返回long型,根据long型的取值范围-231~231-1(-2147483648~2147483647),故对大于2.1G的文件进行操作时出错。

    【注意】ftell(fp); 利用函数 ftell() 也能方便地知道一个文件的长。如以下语句序列:

    fseek(fp, 0L,SEEK_END); len =ftell(fp);

      首先将文件的当前位置移到文件的末尾,然后调用函数ftell()获得当前位置相对于文件首的位移,该位移值等于文件所含字节数。

你可能感兴趣的:(c,文件操作)