ToB企服应用市场:ToB评测及商务社交产业平台

标题: C语言中的文件和文件操作 [打印本页]

作者: 小秦哥    时间: 3 天前
标题: C语言中的文件和文件操作
一、文件的打开和关闭

流和标准流
流:想象为流淌着字符的河。
C语言程序在启动时,默认打开stdin\stdout\stderr这三个标准流。
文件指针:FIFE*
  1. //打开文件
  2. FIFE* fopen(const char* filename,const char* mode);
  3. //关闭文件
  4. int fclose(FIFE* stream);
复制代码
mode表现文件的打开方式。
这里我只列举几种常见的方式:
文件使用方式寄义r:只读为了输入数据,打开一个已经存在的文本文件w:只写为了输出数据,打开一个文本文件,若文件不存在则新建一个a:追加向文本文件尾添加数据

2.

3.

添加刚才的text.txt。
二、文件的次序读写

下面说的全部输入流一般适用于标准输入流和其他输入流(如文件输入流);以此类推输出流。
留意:固然按照我编写的次序都是将输入(读)放在前面,但实际应用时应写写入数据创建文件后,才能乐成读出数据。
fgetc和fputc

字符输入函数和输出函数,使用于全部输入/出流

fputc:要写入的字符int提升。
  1. int main()
  2. {
  3.         FIFE* pf = fopen("test.txt","w");
  4.         if(pf == NULL)
  5.         {
  6.                 perror("fopen");
  7.                 return 1;
  8.         }
  9.         //写文件
  10.         char ch = 0;
  11.         for(ch='a';ch<='z';ch++)
  12.         {
  13.                 fputc(ch,pf);
  14.         }       
  15.         //关闭文件
  16.         fclose(pf);
  17.         pf = NULL;
  18.         return 0;
  19. }
复制代码

fgetc的返回值为int,当位于文件末端或读取错误时会返回EOF(-1)。
  1.         //读文件
  2.         int ch = 0;
  3.         while((ch = fgetc(pf)) != EOF)
  4.         {
  5.                 printf("%c",ch);
  6.         }
复制代码
fgets和fputs

文本行输入/出函数,适用于全部输入/出流

直到到达终止字符\0制止复制。
  1.         fputs("hello world\n",pf);//\n也会展现出来
  2.         fputs("hello!",pf);
复制代码

换行符会使 fgets 制止读取,但它被函数视为有效字符,并包含在复制到 str 的字符串中。
  1.         //读文件
  2.         char arr[20] = {0};
  3.         while(fgets(arr,20,pf) != NULL)
  4.         {
  5.                 printf("%s",arr);
  6.         }
复制代码
这里num表现一次读取的最大字符数,留意纵然小于字符串个数,相当于多读取几次但是获取的结果照旧完备的。
fscanf和fprintf

格式化输入函数和输出函数,适用于全部输入/出流

在format参数之后,该函数至少需要与format指定的相同数量的附加参数。
  1. struct S
  2. {
  3.         char name[20];
  4.         int age;
  5.         float score;
  6. };
  7. int main()
  8. {
  9.         struct S s = { "张三", 20, 65.5f };
  10.         //想把s中的数据存放在文件中
  11.         FILE* pf = fopen("test.txt", "w");
  12.         if (pf == NULL)
  13.         {
  14.                 perror("fopen");
  15.                 return 1;
  16.         }
  17.         //写文件 - 是以文本的形式写进去的
  18.         fprintf(pf, "%s %d %f", s.name, s.age, s.score);
  19.         fclose(pf);
  20.         pf = NULL;
  21.         return 0;
  22. }
复制代码

  1.         fscanf(pf, "%s %d %f", s.name, &(s.age), &(s.score));
复制代码
sscanf和sprintf

分别用于从字符串读取格式化的数据和将格式化的数据写入字符串,这两个函数不直接适用于文件流或标准输入/输出流(如 stdin 和 stdout),但可以用于处理字符串数据,这些字符串可以来源于文件读取或任何其他来源。

缓冲区的巨细应该足够大,以包含整个结果字符串。

  1. int main()
  2. {
  3.         char buf[200] = { 0 };
  4.         struct S s = { "张三", 20, 65.5f };
  5.         sprintf(buf, "%s %d %f", s.name, s.age, s.score);
  6.         printf("1以字符串的形式: %s\n", buf);//1
  7.         struct S t = {0};
  8.         sscanf(buf, "%s %d %f", t.name, &(t.age), &(t.score));
  9.         printf("2按照格式打印  : %s %d %f\n", t.name, t.age, t.score);//2
  10.         return 0;
  11. }
复制代码
fread和fwrite

二进制输入、输出,适用于文件输入/出流

返回乐成写入的元素个数。
  1. int main()
  2. {
  3.         int arr[] = { 1,2,3,4,5 };
  4.         FILE*pf = fopen("test.txt", "wb");
  5.         if (pf == NULL)
  6.         {
  7.                 perror("fopen");
  8.                 return 1;
  9.         }
  10.         //写数据
  11.         int sz = sizeof(arr) / sizeof(arr[0]);
  12.         fwrite(arr, sizeof(arr[0]), sz, pf);//以二进制的形式写进去的
  13.         fclose(pf);
  14.         pf = NULL;
  15.         return 0;
  16. }
复制代码

这时test.txt文件里的数据是看不懂的,因为是二进制文件,下面打印出来观察。

  1. int main()
  2. {
  3.         int arr[5] = { 0 };
  4.         FILE* pf = fopen("test.txt", "rb");
  5.         if (pf == NULL)
  6.         {
  7.                 perror("fopen");
  8.                 return 1;
  9.         }
  10.         //读数据-以二进制的形式写进去的
  11.         int i = 0;
  12.         while (fread(&arr[i], sizeof(int), 1, pf))//或用for循环逐个打印
  13.         {
  14.                 printf("%d ", arr[i]);
  15.                 i++;
  16.         }
  17.         fclose(pf);
  18.         pf = NULL;
  19.         return 0;
  20. }
复制代码
这样打印出1 2 3 4 5 正常。
三、文件的随机读写

1.fseek

根据文件指针的位置和偏移量来定位文件指针(文件内容的光标)。
int fseek ( FILE * stream, long int offset, int origin );
这里的origin有三种大概:分别是SEEK_SET(开始),SEEK_CUR(当前光标),SEEK_END(末端)。
注:当从后先前移动光标时,偏移量为负数。
2.ftell

返回文件指针相对于起始位置的偏移量。
long int ftell ( FILE * stream );
eg:可用于求字符串长度等。
3.rewind

让文件指针的位置回到文件的起始位置。
void rewind ( FILE * stream );
eg:可用于不必记载直接回到指针起始位置等。
四、补充

1.文件读取结束的判定

feof,不能原来判断文件是否结束,作用:判断文件读取结束时,是否是因为遇到文件尾。

  1. int main()
  2. {
  3.         FILE* pf = fopen("test.txt", "r");
  4.         if (pf == NULL)
  5.         {
  6.                 perror("fopen");
  7.                 return 1;
  8.         }
  9.         //读取
  10.         int ch = 0;
  11.         while ((ch = fgetc(pf)) != EOF)
  12.         {
  13.                 printf("%c\n", ch);
  14.         }
  15.         //判断是什么原因导致读取结束的
  16.         if (feof(pf))
  17.         {
  18.                 printf("遇到文件末尾,读取正常结束\n");
  19.         }
  20.         else if (ferror(pf))
  21.         {
  22.                 perror("fgetc");
  23.         }
  24.         return 0;
  25. }
复制代码
2.文件缓冲区


数据优先送到内存中的缓冲区,装满后一起送到磁盘上…
推荐学习网站,方便查找函数:链接: cpluscplus

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4