【C语言】文件操作(下部)

格式化读写 ‘fscanf()’、’fprintf()’

格式化读 ‘fsanf()’

用于从指定文件读取 格式化字符串

#include <stdio.h>
...
int fscanf(FILE *stream, const char *format, ...);

用法:scanf()一样,只是多了 stream 参数

fscanf(fp, "%d-%d-%d", &year, &month, &day);

返回值

  • 调用成功,返回值是成功获取 并 填充到 附加参数中的个数。
  • 调用失败,返回值小于 附加参数的 个数(甚至是 0)。
  • 如果读取到标准输入流的结尾处,则返回 EOF

格式化读 ‘fprintf()’

用于打印格式化字符串指定的文件

#include <stdio.h>
...
int fprintf(FILE *stream, const char *format, ...);

用法:printf()一样,只是多了 stream 参数

fprintf(fp, "I love You!\n");
fprintf(fp, "Today is %d-%d-%d\n", 2021, 1, 22);

返回值

  • 调用成功,返回值是实际 打印的 字符数(不包含表示字符串结束的 ‘\0’);
  • 调用失败,返回值是一个负数

实例

格式化文件读写

#include <stdio.h>
#include <stdlib.h>

#define PATH "./lines.txt"

int main(void){
    // 打开文件
    FILE *fpw = fopen(PATH,"w");
    if (fpw == NULL)exit(1); // 文件写入打开失败

    // 格式化写入文件
    fprintf(fpw, "Today is %d-%d-%d\n", 2021, 1, 22);

    // 关闭文件
    fclose(fpw);

    // 打开文件
    FILE *fpr = fopen(PATH,"r");
    if (fpr == NULL)exit(2); // 文件读取打开失败

    // 读取文件
    int year,month,day;
    fscanf(fpr,"Today is %d-%d-%d",&year,&month,&day);
    printf("%d-%d-%d\n",year,month,day);

    // 关闭读取文件
    fclose(fpr);

    return 0;
}

mark

二进制读写 ‘fread()’、’fwrite()’

格式化读 ‘fread()’

用于从指定的文件读取 指定尺寸的数据。

#include <stdio.h>
...
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

参数:

  • ptr:指向存放数据空间的 指针,该内存块的尺寸最小应该是 size * nmemb 个字节
  • size:要读取的每个元素的尺寸
  • nmemb:要读取的元素个数
  • stream:是一个 FILE 对象的指针

返回值

  • 成功:
    • 实际 读取到的元素个数 (nmemb)
  • 失败:
    • 返回比 nmemb 参数的值,表示可能读取到文件末尾或者有错误发生(可以使用 feof 函数或 ferror 函数进一步判断)。

格式化读 ‘fwrite()’

指定 尺寸的数据写入到指定的文件中。

#include <stdio.h>
...
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

参数:

  • ptr:指向存放数据空间的 指针,该内存块的尺寸最小应该是 size * nmemb 个字节
  • size:要写入的每个元素的尺寸
  • nmemb:要写入的元素个数
  • stream:是一个 FILE 对象的指针

返回值

  • 成功:
    • 返回实际 写入到文件中的元素个数(nmemb)
  • 失败:
    • 如果返回值与 nmemb 参数的值不同,则有错误发生

实例

#include <stdio.h>
#include <stdlib.h>

#define PATH "data.txt"

struct Data {
    int year;
    int month;
    int day;
};

int main(void){
    // 打开文件
    FILE *fpw = fopen(PATH,"w");
    if (fpw == NULL)exit(1); // 打开写入文件失败

    // 以二进制形式写入结构体到文件
    struct Data *data_write = (struct Data *)malloc(sizeof(struct Data));
    data_write->year = 2021;
    data_write->month = 1;
    data_write->day = 21;
    fwrite(data_write,sizeof(struct Data),1,fpw);
    free(data_write);

    // 关闭文件
    fclose(fpw);

    // 打开文件
    FILE *fpr = fopen(PATH,"r");
    if (fpw == NULL)exit(2); // 打开读取文件失败

    // 以二进制形式读取文件
    struct Data *data_read = (struct Data *)malloc(sizeof(struct Data));
    fread(data_read,sizeof(struct Data),1,fpr);
    printf("%d-%d-%d\n",data_read->year,data_read->month,data_read->day);
    free(data_read);

    return 0;
}

mark

发表评论 / Comment

用心评论~