【C进阶】文件操作(上)--(详解、非常适合基础入门学习)(下)

简介: 【C进阶】文件操作(上)--(详解、非常适合基础入门学习)(下)

5.fprintf--针对所有输出流(文件流/stdout)格式化输出函数

以下可以看到fprintf只是比printf多了一个流指针的参数而已。

31bf12edf2c44126b67b59175aa830a6.png

与printf的区别:printf是针对标准输出流 (stdout) 的格式化的输出函数

假设要把struct S s = { 100,3.14f,"zhangsan" };信息打印出来那应该怎么写呢?

那就应该先写成printf("%d %f %s\n", s.n, s.f, s.arr);,然后在前面加个参数改成fprintf(pf,"%d %f %s\n", s.n, s.f, s.arr)即可

#include<stdio.h>
struct S
{
  int n;
  float f;
  char arr[20];
};
int main()
{
  struct S s = { 100,3.14f,"zhangsan" };
  //打开文件
  FILE* pf = fopen("test.txt", "w");
  if (NULL == pf)
  {
    perror("fopen");
    return 1;
  }
  //写文件
  fprintf(pf, "%d %f %s\n", s.n, s.f, s.arr);
  //关闭文件
  fclose(pf);
  pf = NULL;
  return 0;
}

输出:

21ea8d5341c6482a94dd6c3cd122e6b2.png


6.fscanf -- 针对所有输入流(文件流/stdin)格式化输入函数

跟fprintf传的文件流指针是一样的

25445c1d8b6547c78b776bfdb41ad1c1.png

与scanf的区别:是针对标准输入流 (stdin)的格式化的输入函数

#include<stdio.h>
struct S
{
  int n;
  float f;
  char arr[20];
};
int main()
{
  struct S s = { 100,3.14f,"zhangsan" };
  //打开文件
  FILE* pf = fopen("test.txt", "w");
  if (NULL == pf)
  {
    perror("fopen");
    return 1;
  }
  //写文件
  fscanf(pf, "%d %f %s",&(s.n),&(s.f),s.arr);//数组名arr是首元素地址,所以不需要取地址操作符
  printf("%d %f %s\n", s.n, s.f, s.arr);
  //关闭文件
  fclose(pf);
  pf = NULL;
  return 0;
}


执行:

2d429363e2934120a00842936dff93d3.png

为什么需要用到"流"?

前提:如何把数据写进入外部设备,需要对每一种外部设备的操作比较多的了解,例如数据是怎么写进入文件、屏幕、网络、打印机等外部设备,都得知道它们的实现细节(读和写的细节),对于程序员来说太难了。

c870da60986d4bc187e9afacd028faa7.png

流的概念: 这时候抽象化了一个概念“流”,"流"知道怎么把数据写进各种外部设备的细节,那对于程序员而言,要读取数据就从流里面读,要写数据就写到流里面就可以了,至于这个流怎么跟外部设备交互的是不需要关心的。

流的种类:

stdin标准输入流 stdou标准输出流 stderr标准错误流都是FILE*的指针

a8e90ef60c324b1eaccd37500a552818.png

stdin和stdout的适用情况

回到前面的输入输出函数:

fgetc、fgets、fscanf均适用于文件流以及标准输入流 -- stdin

fputc、fputs、fprintf均适用于文件流以及标准输出流 -- stdout


1.fgetc测试:

#include<stdio.h>
int main()
{
  int ch = fgetc(stdin);//输入
  printf("%c\n", ch);
    return 0;
}


执行:以下是输入一个字符和输出的情况

60056ebf44634868a20dc102c96fec98.png

fb1f934e8f4a4adf945a5f4f3353cffb.png


2.fputc测试:

int main()
{
  fputc('a', stdout);//输出
  fputc('f', stdout);
  fputc('g', stdout);
  fputc('z', stdout);
    return 0;
}


执行:

eefcdfbeaa044e47befbbfed05d4d5d6.png

3.fprintf测试:

int main()
{
  struct S s = { 1000,3.666f,"hehe" };
  fprintf(stdout,"%d %f %s\n",s.n,s.f,s.arr);
    return 0;
}


执行:

eb61b49759734b44879b40837f47c35a.png

4.fscanf测试:

int main()
{
  struct S s = { 0 };
  fscanf(stdin, "%d %f %s",&(s.n),&(s.f),s.arr);
  fprintf(stdout, "%d %f %s\n", s.n, s.f, s.arr);
}


fc841adad0c04fb4aa7bb5996560a391.png


7.sscanf和sprintf

sscanf文献

a6c7b87843e24ad0a3748ec102dc90c8.png

翻译:

233b7545321b4683923e40a22d44c989.png

sprintf文献

47319a4191904d999462b464e7479506.png

翻译:

6a77cdb9115447f791ad3e96ab466559.png

sscanf--把字符串转换成格式化的数据

sprintf--把格式化的数据转换成字符串

struct S
{
  int n;
  float f;
  char arr[20];
};
int main()
{
  //序列化和反序列化
  struct S s = { 200,3.5f,"wangwu" };
  //把一个结构体转换成字符串
  char arr[200] = { 0 };
  sprintf(arr, "%d %f %s\n", s.n, s.f, arr);
  printf("字符串的数据: %s\n", arr);
  //把一个字符串转换成对应的格式化数据
  struct S tmp = { 0 };
  sscanf(arr, "%d %f %s", &(tmp).n, &(tmp.f), &tmp.arr);
  printf("格式化的数据:%d %f %s\n", tmp.n, tmp.f, tmp.arr);
  return 0;
}

执行:

cd2e4fb988ca4a2090b3e076641bdbe6.png

关于文件操作的知识还有下半篇,欢迎大佬指正,感谢支持!

相关文章
|
编译器
【C进阶】文件操作(下)(详解--适合初学者入门)(上)
【C进阶】文件操作(下)(详解--适合初学者入门)(上)
|
XML 移动开发 JavaScript
JavaScriptDOM编程(基础&进阶)1
JavaScriptDOM编程(基础&进阶)1
57 0
|
JavaScript 前端开发
JavaScriptDOM编程(基础&进阶)2
JavaScriptDOM编程(基础&进阶)2
52 0
|
JavaScript 前端开发
JavaScriptDOM编程(基础&进阶)3
JavaScriptDOM编程(基础&进阶)3
60 0
|
编译器 Linux 数据库
【C进阶】文件操作(上)--(详解、非常适合基础入门学习)(上)
【C进阶】文件操作(上)--(详解、非常适合基础入门学习)(上)
|
人工智能
【C进阶】文件操作(上)--(详解、非常适合基础入门学习)(中)
【C进阶】文件操作(上)--(详解、非常适合基础入门学习)(中)
|
5天前
|
存储 API 开发工具
探索安卓开发:从基础到进阶
【10月更文挑战第37天】在这篇文章中,我们将一起探索安卓开发的奥秘。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和建议。我们将从安卓开发的基础开始,逐步深入到更复杂的主题,如自定义组件、性能优化等。最后,我们将通过一个代码示例来展示如何实现一个简单的安卓应用。让我们一起开始吧!
|
2月前
|
存储 XML 前端开发
探索Android应用开发:从基础到进阶
【8月更文挑战第57天】在这篇文章中,我们将深入探讨Android应用开发的奥秘。无论你是新手还是有经验的开发者,本文都将为你提供有价值的见解和技巧。我们将从基本的UI设计开始,逐步介绍数据存储、网络请求等高级主题,并展示一些实用的代码示例。让我们一起踏上这段激动人心的旅程吧!
|
2月前
|
人工智能 数据挖掘 开发者
Python编程:从基础到进阶
【8月更文挑战第59天】本文将带你进入Python的世界,从基础语法到进阶技巧,让你轻松掌握Python编程。我们将通过实例讲解,让你在实际操作中提升技能。无论你是初学者还是有一定基础的开发者,都能在本文中找到适合自己的学习内容。让我们一起探索Python的魅力吧!
|
2月前
|
机器学习/深度学习 存储 人工智能
探索Python编程的魔法:从基础到进阶
【9月更文挑战第16天】本文将带领你进入Python编程的世界,无论你是初学者还是有一定经验的开发者。我们将一起揭开Python编程的神秘面纱,通过实际案例和代码示例,深入浅出地探讨Python的基础语法、数据结构、面向对象编程以及函数式编程等核心概念。文章旨在提供一条清晰的学习路径,帮助你构建坚实的编程基础,并逐步过渡到更高级的编程技巧。无论你的目标是数据分析、网络开发还是机器学习,这篇文章都将为你打下扎实的基础,让你在编程的道路上越走越远。
21 6