【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

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

相关文章
|
7月前
|
Linux 数据处理 C++
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用(一)
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用
301 0
|
7月前
|
消息中间件 Linux 数据处理
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用(二)
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用
208 1
|
7月前
|
存储 Linux API
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用(三)
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用
131 1
|
编译器
【C进阶】文件操作(下)(详解--适合初学者入门)(上)
【C进阶】文件操作(下)(详解--适合初学者入门)(上)
|
JavaScript 前端开发
JavaScriptDOM编程(基础&进阶)3
JavaScriptDOM编程(基础&进阶)3
63 0
|
XML 移动开发 JavaScript
JavaScriptDOM编程(基础&进阶)1
JavaScriptDOM编程(基础&进阶)1
61 0
|
JavaScript 前端开发
JavaScriptDOM编程(基础&进阶)2
JavaScriptDOM编程(基础&进阶)2
58 0
|
编译器 Linux 数据库
【C进阶】文件操作(上)--(详解、非常适合基础入门学习)(上)
【C进阶】文件操作(上)--(详解、非常适合基础入门学习)(上)
|
人工智能
【C进阶】文件操作(上)--(详解、非常适合基础入门学习)(中)
【C进阶】文件操作(上)--(详解、非常适合基础入门学习)(中)
|
6月前
|
Linux 开发工具 C++
技术笔记:RustGUI编程
技术笔记:RustGUI编程