百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

C语言备忘录 - 19. 文件读写(c语言读写文件的编码格式)

toyiye 2024-09-08 10:02 4 浏览 0 评论

一、fgetc() 与 fputc()

#include <stdio.h>

int fgetc(FILE *stream);
int fputc(int c, FILE *stream);
  • fgetc() 用于从文件流中读取下一个字符并推进文件的位置指示器,该函数将读取到的 unsigned char 类型转换为 int 类型并返回;如果文件结束或者遇到错误则返回 EOF。
  • fputc() 用于将一个字符写入到指定的文件中并推进文件的位置指示器,如果写入成功,它会返回写入的字符,如果发生错误,则会返回 EOF。
#include <stdio.h>
#include <stdlib.h>

int main()
{
  FILE *fpr;
  FILE *fpw;
  int ch;

  /* 以只读模式打开本地 hello.txt 文件 */
  if ((fpr = fopen("./hello.txt", "r")) == NULL) {
    printf("文件打开失败!");
    exit(EXIT_FAILURE);
  }
  /* 以写入模式打开 hello1.txt 文件,不存在就创建 */
  if ((fpw = fopen("./hello1.txt", "w")) == NULL) {
    printf("文件打开失败!");
    exit(EXIT_FAILURE);
  }

  /* 循环从文件中读取一个字符 */
  while ((ch = fgetc(fpr)) != EOF) {
    /* 打印字符到标准输出 */
    putchar(ch);
    /* 打印字符到 fpw 文件流 */
    fputc(ch, fpw);
  }

  /* 关闭文件 */
  fclose(fpr);
  fclose(fpw);

  return 0;
}

二、fgets() 与 fputs()

#include <stdio.h>

/*
 buff:用于存放读取到字符串的缓冲区
 size:指定读取的字符数(包括最后自动添加的 '\0')
 stream:待操作的文件流
 */
char *fgets(char *buff, int size, FILE *stream);
int fputs(const char *s, FILE *stream);
  • fgets() 用于读取字符串到 buff 缓冲区,最多可以读取 size - 1 个字符,因为结尾处会自动添加一个字符串结束符 '\0'。当读取到换行符('\n')或文件结束符(EOF)时,表示结束读取('\n' 会被作为一个合法的字符读取)。如果函数调用成功,返回 buff 参数指向的地址。
  • fputs() 用于将一个字符串写入到指定的文件中,表示字符串结尾的 '\0' 不会被一并写入。如果写入成功,它会返回一个非0值,如果发生错误,则会返回 EOF。
#include <stdio.h>
#include <stdlib.h>

int main()
{
  FILE *fpr;
  FILE *fpw;
  char str[50];

  /* 以只读模式打开本地 hello.txt 文件 */
  if ((fpr = fopen("./hello.txt", "r")) == NULL) {
    printf("文件打开失败!");
    exit(EXIT_FAILURE);
  }
  /* 以写入模式打开 hello1.txt 文件,不存在就创建 */
  if ((fpw = fopen("./hello1.txt", "w")) == NULL) {
    printf("文件打开失败!");
    exit(EXIT_FAILURE);
  }

  while (1) {
    /* 读取字符串到缓冲区 */
    fgets(str, 50, fpr);
    /* 文件末尾指示器被设置时结束循环 */
    if (feof(fpr)) {
      break;
    }
    /* 打印字符串到标准输出 */
    printf("%s", str);
    /* 打印字符串到 fpw 文件流 */
    fputs(str, fpw);
  }

  /* 关闭文件 */
  fclose(fpr);
  fclose(fpw);

  return 0;
}

三、fscanf() 与 fprintf()

#include <stdio.h>

/*
 format 格式化字符串,由格式化占位符和普通字符组成
 ... 附加参数
 */
int fscanf(FILE *stream, const char *format, ...);
int fprintf(FILE *stream, const char *format, ...);
  • fscanf() 用于从指定文件中读取格式化字符串。如果函数调用成功,返回值是成功获取并填充到附加参数中的个数。如果函数调用失败,返回值小于附加参数的个数(甚至是 0)。如果读取到标准输入流的结尾处,则返回 EOF。
  • fprintf() 用于打印格式化字符串到指定的文件。如果函数调用成功,返回值是实际打印的字符数(不包含表示字符串结束的 '\0');如果函数调用失败,返回值是一个负数。
#include <stdio.h>
#include <stdlib.h>

int main()
{
  FILE *fpr;
  FILE *fpw;
  int year, month, day;

  /* 以只读模式打开本地 hello.txt 文件 */
  if ((fpr = fopen("./hello.txt", "r")) == NULL)
  {
    printf("文件打开失败!");
    exit(EXIT_FAILURE);
  }
  /* 以写入模式打开 hello1.txt 文件,不存在就创建 */
  if ((fpw = fopen("./hello1.txt", "w")) == NULL)
  {
    printf("文件打开失败!");
    exit(EXIT_FAILURE);
  }

  int ch;
  while ((ch = fscanf(fpr, "%d-%d-%d", &year, &month, &day)) != EOF)
  {
    /* 打印数据到标准输出 */
    printf("%d-%d-%d\n", year, month, day);
    /* 打印数据到 fpw 文件流*/
    fprintf(fpw, "%d-%d-%d\n", year, month, day);
  }

  /* 关闭文件 */
  fclose(fpr);
  fclose(fpw);

  return 0;
}

四、fread() 与 fwrite()

#include <stdio.h>

/*
 ptr:指向存放数据的内存块指针,该内存块的尺寸最小应该是 size * nmemb 个字节
 size:指定要读取/写入的每个元素的尺寸,最终尺寸等于 size * nmemb
 nmemb:指定要读取/写入的元素个数,最终尺寸等于 size * nmemb
 stream:待操作的文件流
 */
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);
  • fread() 用于从指定的文件中读取指定尺寸的数据。返回实际读取到的元素个数(nmemb);如果返回值比 nmemb 参数的值小,表示可能读取到文件末尾或者有错误发生(可以使用 feof 函数或 ferror 函数进一步判断)。
  • fwrite() 用于将指定尺寸的数据写入到指定的文件中。返回实际写入到文件中的元素个数(nmemb);如果返回值与 nmemb 参数的值不同,则有错误发生。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Book
{
  char name[50];
  char author[50];
};

int main()
{
  FILE *fpr;
  FILE *fpw;
  struct Book *book;

  // 为结构体分配堆内存空间
  book = (struct Book *)malloc(sizeof(struct Book));
  if (book == NULL) {
    printf("内存分配失败!\n");
    exit(EXIT_FAILURE);
  }
  strcpy(book->name, "C语言备忘录");
  strcpy(book->author, "liwy");

  /* 以写入模式打开 hello1.txt 文件,不存在就创建 */
  if ((fpw = fopen("./hello.txt", "w")) == NULL) {
    printf("文件打开失败!");
    exit(EXIT_FAILURE);
  }
  /* 将数据写入文件 */
  fwrite(book, sizeof(struct Book), 1, fpw);
  /* 关闭文件 */
  fclose(fpw);

  /* 以只读模式打开本地 hello.txt 文件 */
  if ((fpr = fopen("./hello.txt", "r")) == NULL) {
    printf("文件打开失败!");
    exit(EXIT_FAILURE);
  }
  /* 读取指定尺寸的数据 */
  fread(book, sizeof(struct Book), 1, fpr);
  printf("书名:%s\n", book->name);
  printf("作者:%s\n", book->author);
  /* 关闭文件 */
  fclose(fpr);

  return 0;
} 

五、IO缓冲区

对于数据流,有三种缓存模式:不缓存,按块缓存和按行缓存。如果输出流设置为不缓存,数据会直接写入目标文件或打印到屏幕上;如果设置为按块缓存,那么数据会先写入到缓存块中;如果设置为按行缓存,那么在接收到换行符('\n')之前,数据都是先缓存在缓冲区的。

1. fflush()

用于将缓冲区内的数据强制写入指定的文件中。

#include <stdio.h>

int fflush(FILE *stream);

如果函数调用成功,返回值是 0;如果函数调用失败,返回 EOF 并设置 errno 为指定的错误。

2. setvbuf()

用于指定一个数据流的缓存模式。

#include <stdio.h>

int setvbuf(FILE *stream, char *buf, int mode, size_t size);
  • stream :该参数是一个 FILE 对象的指针,指定一个打开的数据流
  • buf :指定一个用户分配的缓冲区,如果该参数为 NULL,那么函数会自动分配一个指定尺寸的缓冲区
  • mode :指定数据流的缓存模式:_IOFBF(按块缓存)、_IOLBF(按行缓存)、_IONBF(不缓存)
  • size :指定缓冲区的尺寸(字节)

如果函数调用成功,返回值是 0;如果函数调用失败,返回值的是一个非 0 值。

#include <stdio.h>
#include <string.h>

int main(void)
{
  char buff[1024];
  memset(buff, '\0', sizeof(buff));

  /* 按块缓冲,当缓冲区写满时才写入文件 */
  setvbuf(stdout, buff, _IOFBF, 1024);

  fprintf(stdout, "Hello C!\n");

  /* 强制将缓冲区内容写入文件 */
  fflush(stdout);

  fprintf(stdout, "Hello liwy!\n");

  // 阻塞, Hello liwy! 将不会输出
  getchar();

  return 0;
}

相关推荐

# Python 3 # Python 3字典Dictionary(1)

Python3字典字典是另一种可变容器模型,且可存储任意类型对象。字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中,格式如...

Python第八课:数据类型中的字典及其函数与方法

Python3字典字典是另一种可变容器模型,且可存储任意类型对象。字典的每个键值...

Python中字典详解(python 中字典)

字典是Python中使用键进行索引的重要数据结构。它们是无序的项序列(键值对),这意味着顺序不被保留。键是不可变的。与列表一样,字典的值可以保存异构数据,即整数、浮点、字符串、NaN、布尔值、列表、数...

Python3.9又更新了:dict内置新功能,正式版十月见面

机器之心报道参与:一鸣、JaminPython3.8的热乎劲还没过去,Python就又双叒叕要更新了。近日,3.9版本的第四个alpha版已经开源。从文档中,我们可以看到官方透露的对dic...

Python3 基本数据类型详解(python三种基本数据类型)

文章来源:加米谷大数据Python中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。在Python中,变量就是变量,它没有类型,我们所说的"类型"是变...

一文掌握Python的字典(python字典用法大全)

字典是Python中最强大、最灵活的内置数据结构之一。它们允许存储键值对,从而实现高效的数据检索、操作和组织。本文深入探讨了字典,涵盖了它们的创建、操作和高级用法,以帮助中级Python开发...

超级完整|Python字典详解(python字典的方法或操作)

一、字典概述01字典的格式Python字典是一种可变容器模型,且可存储任意类型对象,如字符串、数字、元组等其他容器模型。字典的每个键值key=>value对用冒号:分割,每个对之间用逗号,...

Python3.9版本新特性:字典合并操作的详细解读

处于测试阶段的Python3.9版本中有一个新特性:我们在使用Python字典时,将能够编写出更可读、更紧凑的代码啦!Python版本你现在使用哪种版本的Python?3.7分?3.5分?还是2.7...

python 自学,字典3(一些例子)(python字典有哪些基本操作)

例子11;如何批量复制字典里的内容2;如何批量修改字典的内容3;如何批量修改字典里某些指定的内容...

Python3.9中的字典合并和更新,几乎影响了所有Python程序员

全文共2837字,预计学习时长9分钟Python3.9正在积极开发,并计划于今年10月发布。2月26日,开发团队发布了alpha4版本。该版本引入了新的合并(|)和更新(|=)运算符,这个新特性几乎...

Python3大字典:《Python3自学速查手册.pdf》限时下载中

最近有人会想了,2022了,想学Python晚不晚,学习python有前途吗?IT行业行业薪资高,发展前景好,是很多求职群里严重的香饽饽,而要进入这个高薪行业,也不是那么轻而易举的,拿信工专业的大学生...

python学习——字典(python字典基本操作)

字典Python的字典数据类型是基于hash散列算法实现的,采用键值对(key:value)的形式,根据key的值计算value的地址,具有非常快的查取和插入速度。但它是无序的,包含的元素个数不限,值...

324页清华教授撰写【Python 3 菜鸟查询手册】火了,小白入门字典

如何入门学习python...

Python3.9中的字典合并和更新,了解一下

全文共2837字,预计学习时长9分钟Python3.9正在积极开发,并计划于今年10月发布。2月26日,开发团队发布了alpha4版本。该版本引入了新的合并(|)和更新(|=)运算符,这个新特性几乎...

python3基础之字典(python中字典的基本操作)

字典和列表一样,也是python内置的一种数据结构。字典的结构如下图:列表用中括号[]把元素包起来,而字典是用大括号{}把元素包起来,只不过字典的每一个元素都包含键和值两部分。键和值是一一对应的...

取消回复欢迎 发表评论:

请填写验证码