确定不进来看看吗?详细讲解C语言文件操作(示例分析每个函数)(中)

简介: 确定不进来看看吗?详细讲解C语言文件操作(示例分析每个函数)

4.1 文件的顺序读写


对于输入\输出函数的简单示例:


4,11 fputc函数


函数功能: fputc函数,按单个字符输出到流.


函数模型:



参数介绍:,


参数 含义
character 要输入的字符(整形是因为会转化为ASCII码值)
stream 指向要输出到的流


‘w’,(只写)从内存写/输出数据到文件中


示例:


向文件写入26个小写英文字母,空格分隔


#include <stdio.h>
int main()
{
  FILE* pFile;
  //打开文件
  pFile = fopen("123.txt", "w");
  if (pFile != NULL)
  {
    for (char i = 'a'; i <= 'z'; i++)
    {
      fputc(i, pFile);//从内存中写到流
      fputc(' ', pFile);//写入空格字符
    }
  }
  else
  {
    printf("打开失败");
    return 1;//返回非0
  }
  //关闭文件
  fclose(pFile);
  return 0;
}


//123.txt
a b c d e f g h i j k l m n o p q r s t u v w x y z 


4.12 fgetc函数


函数功能: fgetc从流中读入数据到内存


函数模型


参数 含义
stream 指向标识输入流的 FILE 对象的指针。


‘r’,(只读),从文件中读数据到内存


示例:


#include <stdio.h>
int main()
{
  FILE* pFile;
  char c;
  pFile = fopen("123.txt", "r");//此时123.txt中已经有26个字母了
  if (pFile != NULL)
  {
    while ((c=fgetc(pFile))!=EOF)//从流中写读到内存,直到文件读取结束
    {
      printf("%c",c);
    }
  }
  else
  {
    printf("打开失败");
    return 1;//返回非0
  }
  //关闭文件
  fclose(pFile);
  return 0;
}


运行结果:



4.13 fputs函数


函数功能: fputs将 str 指向流的 C 字符串写入流。


函数模型:



函数参数:


参数 含义
str 要输入的字符串
stream 指向标识输出流的 FILE 对象的指针。


注意:


该函数时按行进行写入字符串.可以在写数据时在后面增加一个换行符,会更加美观.


示例:


#include <stdio.h>
int main()
{
  FILE* pFile;
  char c;
  pFile = fopen("123.txt", "w");//此时123.txt中已经有26个字母了
  if (pFile != NULL)
  {
    fputs("Hello World !!!\n", pFile);
    fputs("Hello CSDN!!!\n", pFile);
    fputs("Hello 初阶牛!!!\n", pFile);
  }
  else
  {
    printf("打开失败");
    return 1;//返回非0
  }
  //关闭文件
  fclose(pFile);
  return 0;
}


运行结果:


虽然之前文本里面已经有了26个英文字母,但是再进行写入操作时,会清空之前的文件内容.



‘a’,追加向文件末尾写数据.


怎样可以保留原来的数据,在数据后面继续增加新数据呢?


只需要将w改成a追加就行了.


pFile = fopen("123.txt", "a");//此时123.txt中已经有24个字母了,a表示追加
  if (pFile != NULL)
  {
    fputs("\n", pFile);//添加换行
    fputs("Hello World !!!\n", pFile);
    fputs("Hello CSDN!!!\n", pFile);
    fputs("Hello 初阶牛!!!\n", pFile);
  }


原文件中的数据↓



指向追加代码后:↓



4.14 fgets函数


函数功能:


从流中读取字符并将其作为 C 字符串存储到 str 中,直到读取 (num-1) 个字符或到达换行符或文件末尾,以先发生者为准。num-1是因’\0’要占一个字节.


函数模型:



函数参数:


参数 含义
str 指向在其中复制字符串读取的字符数组的指针。
num 要复制到 str 的最大字符数(包括终止空字符)。
stream 指向标识输入流的 FILE 对象的指针。stdin 可以用作从标准输入读取的参数。


示例:


#include <stdio.h>
int main()
{
  FILE* pFile;
  char str[4][100];
  pFile = fopen("123.txt", "r");//此时123.txt中已经有24个字母和3行hello ...
  if (pFile != NULL)
  {
    fgets(str[0], 55, pFile);
    fgets(str[1], 10, pFile);
    fgets(str[2], 20, pFile);
    fgets(str[3], 30, pFile);
  }
  else
  {
    printf("打开失败");
    return 1;//返回非0
  }
  //关闭文件
  fclose(pFile);
  //打印
  for (int i=0; i < 4; i++)
  {
    printf("%s\n", str[i]);
  }
  return 0;
}


文件中的数据:



读到的数据:



解释:


fgets(str[0], 55, pFile);从文件第一行开始向后读取54个字符,但是还没有到54个字符时,先遇到了换行符,它使 fgets 停止读取,但它被函数视为有效字符,并包含在复制到 str 的字符串中。

并且,终止空字符会自动附加到复制到 str 的字符之后。


所以第一行打印:


a b c d e f g h i j k l m n o p q r s t u v w x y z


//这下面有两个换行,一个是printf(“%s\n”, str[i]);中的\n,还有一个是文件中的换行也被视作有效字符.


fgets(str[1], 10, pFile);第一行读取完毕之后,光标从下一行开始读取,读取10个字节,即10-1个有效数据(还有一个是’\0’).


运行结果:


Hello Wor


//一个换行,


fgets(str[2], 20, pFile);文件的第二行还未读取结束,则从r后面开始继续读取,20个字节,直到遇到换行.


同理,打印:


ld !!!


//这里两个换行,是printf(“%s\n”, str[i]);中的\n,


fgets(str[3], 30, pFile);这个从第三行开始,遇到换行结束


打印结果:


Hello CSDN!!!


//两个换行


4.15 fsacnf函数与fprintf函数


格式化输入输出函数是什么意思?


其实很简单,就是对于一些特殊格式的输入,比如输入一个保留两位小数的浮点型.


示例:从键盘得到数据,再将数据写入文件


输入:


初阶牛 20 1.755

typedef struct student
{
  char name[10];
  int age;
  float stature;
}student;
#include <stdio.h>
int main()
{
  FILE* pFile;
  student s1 ;
  fscanf(stdin, "%s%d%f",s1.name, &s1.age, &s1.stature);//从标准输入流(键盘)获取数据
  //打开文件
  pFile = fopen("123.txt", "w");
  if (pFile != NULL)
  {
    fprintf(pFile, "%s %d %.2f",s1.name, s1.age, s1.stature);//将数据输出到文件
  }
  else
  {
    printf("打开失败");
    return 1;//返回非0
  }
  //关闭文件
  fclose(pFile);
  return 0;
}


运行结果:


//123.txt


初阶牛 20 1.75


示例:从文件中读取数据输出到显示器(屏幕)


typedef struct student
{
  char name[10];
  int age;
  float stature;
}student;
#include <stdio.h>
int main()
{
  FILE* pFile;
  student s1;
  //打开文件
  pFile = fopen("123.txt", "r");//此时文件中有数据:初阶牛 20 1.75
  if (pFile != NULL)
  {
    fscanf(pFile, "%6s%2d%f", s1.name, &s1.age, &s1.stature);//从文件中读取数据
  }
  else
  {
    printf("打开失败");
    return 1;//返回非0
  }
  //关闭文件
  fclose(pFile);
  fprintf(stdout, "%6s %2d %.2f", s1.name, s1.age, s1.stature);//将数据输出到显示器
  return 0;
}


4.16 fread函数和fwrite函数


函数原型:



参数说明:


参数 含义
ptr 指向要写入的元素数组的指针
size 要写入的每个元素的大小(以字节为单位)
count 元素个数
stream 指向指定输出流的 FILE 对象的指针


图解:


目录
相关文章
|
3月前
|
存储 程序员 C语言
c语言文件操作
本文介绍了C语言中文件操作的核心概念,包括文件缓冲区、数据与程序文件的区别、流的概念及标准输入输出流。重点讲解了文件的打开与关闭、读写操作(如fgetc、fputs、fscanf、fwrite等),以及随机读写函数fseek、ftell和rewind的使用方法。同时说明了文本文件与二进制文件的读取结束判定方式,并通过代码示例展示了实际应用。
|
4月前
|
存储 C语言
`scanf`是C语言中用于按格式读取标准输入的函数
`scanf`是C语言中用于按格式读取标准输入的函数,通过格式字符串解析输入并存入指定变量。需注意输入格式严格匹配,并建议检查返回值以确保读取成功,提升程序健壮性。
1072 0
|
6月前
|
安全 C语言
C语言中的字符、字符串及内存操作函数详细讲解
通过这些函数的正确使用,可以有效管理字符串和内存操作,它们是C语言编程中不可或缺的工具。
348 15
|
7月前
|
存储 编译器 程序员
c语言的文件操作与文件缓冲区
如果没有文件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等再次运行程序,是看不到上次程序的数据的,如果要将数据进行持久化的保存,我们可以使用文件。磁盘(硬盘)上的文件是文件。但是在程序设计中,我们⼀般谈的⽂件有两种:程序文件、数据文件(从文件功能的角度来分类 的)。就比如说我们电脑中以.txt为后缀的就是文件的一种,他就是数据文件。.exe为后缀的就为程序文件。函数名功能适用范围fgetc字符输入函数所有输入流fputc字符输出函数所有输出流fgets。
185 0
|
11月前
|
人工智能 Java 程序员
一文彻底搞清楚C语言的函数
本文介绍C语言函数:函数是程序模块化的工具,由函数头和函数体组成,涵盖定义、调用、参数传递及声明等内容。值传递确保实参不受影响,函数声明增强代码可读性。君志所向,一往无前!
468 1
一文彻底搞清楚C语言的函数
|
11月前
|
人工智能 C语言
|
12月前
|
存储 C语言
【C语言程序设计——函数】递归求斐波那契数列的前n项(头歌实践教学平台习题)【合集】
本关任务是编写递归函数求斐波那契数列的前n项。主要内容包括: 1. **递归的概念**:递归是一种函数直接或间接调用自身的编程技巧,通过“俄罗斯套娃”的方式解决问题。 2. **边界条件的确定**:边界条件是递归停止的条件,确保递归不会无限进行。例如,计算阶乘时,当n为0或1时返回1。 3. **循环控制与跳转语句**:介绍`for`、`while`循环及`break`、`continue`语句的使用方法。 编程要求是在右侧编辑器Begin--End之间补充代码,测试输入分别为3和5,预期输出为斐波那契数列的前几项。通关代码已给出,需确保正确实现递归逻辑并处理好边界条件,以避免栈溢出或结果
683 16
|
12月前
|
存储 编译器 C语言
【C语言程序设计——函数】分数数列求和2(头歌实践教学平台习题)【合集】
函数首部:按照 C 语言语法,函数的定义首部表明这是一个自定义函数,函数名为fun,它接收一个整型参数n,用于指定要求阶乘的那个数,并且函数的返回值类型为float(在实际中如果阶乘结果数值较大,用float可能会有精度损失,也可以考虑使用double等更合适的数据类型,这里以float为例)。例如:// 函数体代码将放在这里函数体内部变量定义:在函数体中,首先需要定义一些变量来辅助完成阶乘的计算。比如需要定义一个变量(通常为float或double类型,这里假设用float。
559 3
|
12月前
|
存储 算法 安全
【C语言程序设计——函数】分数数列求和1(头歌实践教学平台习题)【合集】
if 语句是最基础的形式,当条件为真时执行其内部的语句块;switch 语句则适用于针对一个表达式的多个固定值进行判断,根据表达式的值与各个 case 后的常量值匹配情况,执行相应 case 分支下的语句,直到遇到 break 语句跳出 switch 结构,若没有匹配值则执行 default 分支(可选)。例如,在判断一个数是否大于 10 的场景中,条件表达式为 “num> 10”,这里的 “num” 是程序中的变量,通过比较其值与 10 的大小关系来确定条件的真假。常量的值必须是唯一的,且在同一个。
425 2
|
12月前
|
存储 编译器 C语言
【C语言程序设计——函数】回文数判定(头歌实践教学平台习题)【合集】
算术运算于 C 语言仿若精密 “齿轮组”,驱动着数值处理流程。编写函数求区间[100,500]中所有的回文数,要求每行打印10个数。根据提示在右侧编辑器Begin--End之间的区域内补充必要的代码。如果操作数是浮点数,在 C 语言中是不允许直接进行。的结果是 -1,因为 -7 除以 3 商为 -2,余数为 -1;注意:每一个数据输出格式为 printf("%4d", i);的结果是 1,因为 7 除以 -3 商为 -2,余数为 1。取余运算要求两个操作数必须是整数类型,包括。开始你的任务吧,祝你成功!
224 1