【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

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

目录
打赏
0
0
0
0
37
分享
相关文章
【C进阶】文件操作(下)(详解--适合初学者入门)(上)
【C进阶】文件操作(下)(详解--适合初学者入门)(上)
JavaScriptDOM编程(基础&进阶)2
JavaScriptDOM编程(基础&进阶)2
76 0
JavaScriptDOM编程(基础&进阶)3
JavaScriptDOM编程(基础&进阶)3
69 0
JavaScriptDOM编程(基础&进阶)1
JavaScriptDOM编程(基础&进阶)1
79 0
【C进阶】文件操作(上)--(详解、非常适合基础入门学习)(上)
【C进阶】文件操作(上)--(详解、非常适合基础入门学习)(上)
【C进阶】文件操作(上)--(详解、非常适合基础入门学习)(中)
【C进阶】文件操作(上)--(详解、非常适合基础入门学习)(中)
探索安卓开发:从基础到进阶
【10月更文挑战第37天】在这篇文章中,我们将一起探索安卓开发的奥秘。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和建议。我们将从安卓开发的基础开始,逐步深入到更复杂的主题,如自定义组件、性能优化等。最后,我们将通过一个代码示例来展示如何实现一个简单的安卓应用。让我们一起开始吧!
Python编程之魔法:从基础到进阶的代码实践
在编程的世界里,Python以其简洁和易读性而闻名。本文将通过一系列精选的代码示例,引导你从Python的基础语法出发,逐步探索更深层次的应用,包括数据处理、网络爬虫、自动化脚本以及机器学习模型的构建。每个例子都将是一次新的发现,带你领略Python编程的魅力。无论你是初学者还是希望提升技能的开发者,这些示例都将是你的宝贵财富。让我们开始这段Python编程之旅,一起揭开它的魔法面纱。
|
7月前
|
Java网络编程实战指南与示例代码
Java网络编程实战指南与示例代码