【文件操作的重难点详解】(二)

简介: 【文件操作的重难点详解】(二)

1.3格式化输出函数(fprintf)&&格式化输入函数(fscanf)

格式化输出函数(向文件中写入信息):

int fprintf( FILE *stream, const char *format [, argument ]...);

7509de4e5cd0417f9e8589e759180902.png
struct stu
{
  char name[10];
  char sex[5];
  int age;
  double weight;
};
int main()
{
  struct stu s = { "lisi","男",18,60.0 };
  FILE* pf = fopen("text.txt", "w");
  if (pf == NULL)
  {
    printf("%s\n", strerror(errno));
    return 0;
  }
  fprintf(pf, "%s %s %d %lf", s.name, s.sex, s.age, s.weight);//向文件中输出信息
  fclose(pf);
  pf = NULL;
  return 0;
}

  从代码中可以看到:我们将s进行了初始化,想将该内容拷贝到text.txt文件夹中:



7509de4e5cd0417f9e8589e759180902.png


代码执行后可以明显发现文件夹中已经成功拷贝。

格式化输入函数(从文件中读取信息):

int fscanf( FILE *stream, const char *format [, argument ]... );

struct stu
{
  char name[10];
  char sex[5];
  int age;
  double weight;
};
int main()
{
  struct stu s = { 0 };
  FILE* pf = fopen("text.txt", "r");
  if (pf == NULL)
  {
    printf("%s\n", strerror(errno));
    return 0;
  }
  fscanf(pf, "%s %s %d %lf", s.name, s.sex, &(s.age), &(s.weight));//从文件中获得信息
  printf("%s %s %d %lf", s.name, s.sex, s.age, s.weight);
  fclose(pf);
  pf = NULL;
  return 0;
}

代码中我们对s的内容初始化为0,代码执行后将文件夹中的内容拷贝到了s中:


13bbee6ab7fc4786b72356cf6ed3cb9d.png

我们还可以用stdin&&stdout来从键盘输入数据以及从屏幕上打印数据:


b306e170c80d4253abf1ec5593ca0859.png

1.4  扩展:

intsprintf(char*buffer,constchar*format [,argument] ... );

intsscanf(constchar*buffer,constchar*format [,argument ] ... );

int main()
{
  struct stu s1 = { "lisi","男",18,60 };
  struct stu s2 = { 0 };
  char buf[100] = { 0 };
  //把格式化的数据转换成字符串存储到buf
  sprintf(buf, "%s %s %d %lf", s1.name, s1.sex, s1.age, s1.weight);
  printf("%s\n", buf);
  //从buf中读取格式化的数据到s2中
  sscanf(buf, "%s %s %d %lf", s2.name, s2.sex, &(s2.age), &(s2.weight));
  printf("%s %s %d %lf", s2.name, s2.sex, s2.age, s2.weight);
  return 0;
}

总结:

  1. scanf/printf:是针对标准输入流/标准输出流的格式化输入/输出语句。
  2. fscanf/fprintf:是针对所有输入流/所有输出流的格式化输入/输出语句 。
  3. sscanf/sprintf:sscanf是从字符串中读取格式化数据,sprintf是把格式化数据输出成(存储到)字符串

1.5 二进制输出函数(fwrite)&&二进制输入函数(fread)

二进制输出函数

size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream );

typedef struct stu
{
  char name[20];
  int age;
  double weight;
}stu;
int main()
{
  FILE* pf = fopen("text.txt", "wb");
  if (pf ==NULL)
  {
    printf("%s\n", strerror(errno));
  }
  stu s[2] = { {"zhangsan",18,60},{"lisi",19,65} };
  fwrite(s, sizeof(stu), 2, pf);
  fclose(pf);
  pf = NULL;
  return 0;
}

当我们查看文件里面的内容时:


f2c2a8e5805c46f0bd15884294bb1584.png

有的符号我们认识,但有的符号却很奇怪,为什么呢?

由于我们写入的时二进制的形式,所以有些符号不认识很正常,但是当我们以二进制的形式读取时就不会出现这种奇怪的符号了。

二进制输入函数:

size_t fread( void *buffer, size_t size, size_t count, FILE *stream );

typedef struct stu
{
  char name[20];
  int age;
  double weight;
}stu;
int main()
{
  FILE* pf = fopen("text.txt", "rb");
  if (pf == NULL)
  {
    printf("%s\n", strerror(errno));
  return 0;
  }
  stu s[2] = { 0 };
  fread(s, sizeof(stu), 2, pf);
  printf("%s %d %lf\n%s %d %lf", s[0].name, s[0].age, s[0].weight, s[1].name, s[1].age, s[1].weight);
  fclose(pf);
  pf = NULL;
  return 0;
}

当读取信息时就会读取正常的信息:

4f8f596a753e488d8701bd96c75f15ce.png


2 文件的随机读写

2.1 fseek:根据文件指针的位置和偏移量来定位文件指针

intfseek(FILE*stream,longoffset,intorigin );

 刚开始的时候文件中存放的是abcdef:


2c241619dceb4f598421f205627c201a.png

int main()
{
  FILE* pf = fopen("text.txt", "r");
  if (pf == NULL)
  {
    printf("%s\n", strerror(errno));
    return 0;
  }
  fseek(pf, 2, SEEK_CUR);
  int ch = fgetc(pf);
  printf("%c\n", ch);
  fclose(pf);
  pf = NULL;
  return 0;
}

e61787ad9e104a39a8a8af9652770f8a.png


在这之前我们还得了解一下origin:

SEEK_CUR

Current position of file pointer

SEEK_END

End of file

SEEK_SET

Beginning of file

至于为什么打印的是c:从a开始偏移2个字符得到的就是c.此时pf指向下一个字符(也就是d):

120999e40a064c62af0feb0663b8be8a.png

2.2 ftell :返回文件指针相对于起始位置的偏移量

long ftell( FILE *stream );



5229702bab3f4183bd3d303cc24744fd.png

这个函数的用法很简单,就不多说了。

2.3 rewind :让文件指针的位置回到文件的起始位置

void rewind( FILE *stream );

这个函数的作用是让pf指向文件字符的开头:


2d5669cd4c53416b9074a5c498bdd3ac.png



好了,今天的分享就到这里了。希望老铁们能够指出文章中的错误所在,酸Q。


8be4b6d0c842470ca3d35c73cf9455a4.png



目录
相关文章
|
编译器 数据库 C语言
C语言文件操作(一文带你吃透文件各种操作)
有很多学校都是不会讲文件操作这块知识的,但是考试还要考。文件操作在平常中也是有所应用的。这篇文章详细讲述对于文件的各种操作,对于考试和平常引用是完全足够啦!
101 0
|
6月前
|
存储 程序员 C语言
C语言之详细讲解文件操作(抓住文件操作的奥秘)
C语言之详细讲解文件操作(抓住文件操作的奥秘)
47 0
|
6月前
练习所学文件操作的相关函数
上上篇文章,我们介绍了文件和文件操作函数,现在我们来练习一下所学文件操作的相关函数吧! 实践出真知~
31 0
|
6月前
|
JSON Go 数据格式
第十四章 文件操作
第十四章 文件操作
45 2
|
BI
【文件操作的重难点详解】(一)
【文件操作的重难点详解】(一)
67 0
|
iOS开发 C++
【C++知识点】文件操作(二)
【C++知识点】文件操作(二)
99 0
|
存储 C++ iOS开发
【C++知识点】文件操作(一)
【C++知识点】文件操作(一)
101 0
|
存储 编译器 C语言
【C++知识点】多文件编程
【C++知识点】多文件编程
248 0
抽丝剥茧C语言(高阶)文件操作+练习(中)
抽丝剥茧C语言(高阶)文件操作+练习
|
存储 C语言
抽丝剥茧C语言(高阶)文件操作+练习(下)
抽丝剥茧C语言(高阶)文件操作+练习